apache/iceberg · error · UnsupportedOperationException
Columnar reads are not supported
Error message
Columnar reads are not supported
What it means
SparkRowReaderFactory never supports columnar reads; createColumnarReader unconditionally throws UnsupportedOperationException and supportColumnarReads returns false. The row reader factory exists only for row-based (Record) consumption such as changelog and position-delete reads.
Source
Thrown at spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/source/SparkRowReaderFactory.java:61
if (partition.allTasksOfType(FileScanTask.class)) {
return new RowDataReader(partition);
} else if (partition.allTasksOfType(ChangelogScanTask.class)) {
return new ChangelogRowReader(partition);
} else if (partition.allTasksOfType(PositionDeletesScanTask.class)) {
return new PositionDeletesRowReader(partition);
} else {
throw new UnsupportedOperationException(
"Unsupported task group for row-based reads: " + partition.taskGroup());
}
}
@Override
public PartitionReader<ColumnarBatch> createColumnarReader(InputPartition inputPartition) {
throw new UnsupportedOperationException("Columnar reads are not supported");
}
@Override
public boolean supportColumnarReads(InputPartition inputPartition) {
return false;
}
}
View on GitHub (pinned to 86d9c8fc54)
Solutions
- Use a factory that supports columnar reads (e.g. the SparkBatchQueryReader/SparkScan columnar path) for columnar output
- Ensure the scan reports supportColumnarReads=false so Spark does not request columnar readers from this factory
- Wrap results as rows instead of ColumnarBatch if row-only readers are required
Example fix
// before return new SparkRowReaderFactory(); // used for columnar reads // after return supportsColumnar ? new SparkColumnarReaderFactory() : new SparkRowReaderFactory();
Defensive patterns
Strategy: validation
Validate before calling
if (readerFactory instanceof SparkRowReaderFactory && wantColumnar) {
throw new IllegalArgumentException("Row reader factory cannot serve columnar reads");
} Prevention
- Always return false from supportColumnarReads when advertising the row reader factory
- Select the reader factory based on required output type (rows vs ColumnarBatch)
- Never mix reader factories across scan implementations
When it happens
Trigger: Any call to SparkRowReaderFactory.createColumnarReader, e.g. Spark requesting a columnar batch reader because supportColumnarReads was consulted for a different factory.
Common situations: Custom SparkScan wiring the row reader factory where Spark demands columnar batches; misconfigured batch scan implementations in custom sources built on Iceberg readers.
Related errors
- Row-based reads are not supported
- Unsupported task group for columnar reads: ${partition.taskG
- Columnar reads are not supported
- Columnar reads are not supported
- Cannot apply unknown table change: ${change}
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/f713b2cc4151a290.
Report an issue: GitHub.