{"record":{"id":"9b3450e4ac2b3876","repo":"apache/iceberg","slug":"row-based-reads-are-not-supported-9b3450","errorCode":null,"errorMessage":"Row-based reads are not supported","messagePattern":"Row-based reads are not supported","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/source/SparkColumnarReaderFactory.java","lineNumber":47,"sourceCode":"import org.apache.spark.sql.vectorized.ColumnarBatch;\n\nclass SparkColumnarReaderFactory implements PartitionReaderFactory {\n  private final ParquetBatchReadConf parquetConf;\n  private final OrcBatchReadConf orcConf;\n\n  SparkColumnarReaderFactory(ParquetBatchReadConf conf) {\n    this.parquetConf = conf;\n    this.orcConf = null;\n  }\n\n  SparkColumnarReaderFactory(OrcBatchReadConf conf) {\n    this.orcConf = conf;\n    this.parquetConf = null;\n  }\n\n  @Override\n  public PartitionReader<InternalRow> createReader(InputPartition inputPartition) {\n    throw new UnsupportedOperationException(\"Row-based reads are not supported\");\n  }\n\n  @Override\n  public PartitionReader<ColumnarBatch> createColumnarReader(InputPartition inputPartition) {\n    Preconditions.checkArgument(\n        inputPartition instanceof SparkInputPartition,\n        \"Unknown input partition type: %s\",\n        inputPartition.getClass().getName());\n\n    SparkInputPartition partition = (SparkInputPartition) inputPartition;\n\n    if (partition.allTasksOfType(FileScanTask.class)) {\n      return new BatchDataReader(partition, parquetConf, orcConf);\n    } else {\n      throw new UnsupportedOperationException(\n          \"Unsupported task group for columnar reads: \" + partition.taskGroup());\n    }\n  }","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/source/SparkColumnarReaderFactory.java#L29-L65","documentation":"SparkColumnarReaderFactory only implements createColumnarReader; the row-based createReader API throws UnsupportedOperationException. Iceberg Spark reads in this path are always columnar (Parquet/ORC vectorized), so requesting a row reader is unsupported by design.","triggerScenarios":"Spark attempts row-based micro-batch reads (createReader) on an Iceberg source partition — happens when vectorized reading is effectively disabled/disallowed by Spark while the data source reports columnar support, or custom reader code invokes createReader directly.","commonSituations":"spark.sql.execution.useObjectStoreAggregate / vectorized-reader option conflicts; setting read.options('vectorization-enabled'='false') for formats without vector support; schema plans incompatible with columnar batches (complex types) causing Spark to fall back to row reads.","solutions":["Keep vectorized reads enabled so Spark calls createColumnarReader (spark.sql.iceberg.handle-timestamp-without-timezone / vectorization settings consistent).","If a column-incompatible type forces row fallback, either cast/sanitize the schema or disable columnar support reporting for that scan.","Do not call createReader directly; use createColumnarReader with a SparkInputPartition.","Upgrade the connector version if row fallback handling for your schema exists in newer releases."],"exampleFix":"// before\nspark.conf.set(\"spark.sql.sources.useV1SourceList\", \"\") // may push row-path reads\n// after\n// keep vectorized path: ensure columns are vector-readable, e.g. avoid 'vectorization-enabled'='false' on parquet scans","handlingStrategy":"validation","validationCode":"// check the schema is vector-readable before columnar read config\nboolean vectorizable = table.schema().columns().stream()\n    .allMatch(c -> c.type().typeId() != Type.TypeID.NESTED || supportedNested(c.type()));","typeGuard":null,"tryCatchPattern":"try { reader = factory.createReader(partition); } catch (UnsupportedOperationException e) {\n  reader = fallbackRowReader(partition);\n}","preventionTips":["Keep vectorized read options enabled for parquet/orc scans.","Avoid read options that disable vectorization on columnar formats.","Sanitize schemas with unsupported nested types before reading."],"tags":["spark","vectorization","reader-factory","unsupported"],"backgroundTag":"unsupported-operation","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}