apache/iceberg · error · UnsupportedOperationException
Columnar reads are not supported
Error message
Columnar reads are not supported
What it means
SparkRowReaderFactory is exclusively a row-based reader factory; columnar (Vectorized) reads are intentionally unsupported, and supportColumnarReads returns false. createColumnarReader throws UnsupportedOperationException if invoked anyway.
Source
Thrown at spark/v4.1/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
- Rely on the default supportColumnarReads()=false so Spark never requests columnar reads.
- Use the standard Iceberg SparkReadConf/vectoization path for columnar reads instead of this factory.
- Remove custom overrides that route partitions to createColumnarReader.
- For changelog/position-delete data, use row-based reads only.
Defensive patterns
Strategy: validation
Validate before calling
if (!readerFactory.supportColumnarReads(partition)) { /* request row-based reads instead */ } Type guard
boolean columnarAllowed = readerFactory.supportColumnarReads(partition);
Try / catch
try { return readerFactory.createColumnarReader(partition); } catch (UnsupportedOperationException e) { return readerFactory.createReader(partition); } Prevention
- Always check supportColumnarReads before columnar dispatch
- Use SparkRowReaderFactory only for row-based reads
- Use the vectoization-capable factory for columnar reads
When it happens
Trigger: Spark calls createColumnarReader(InputPartition) on SparkRowReaderFactory, which only happens if supportColumnarReads were overridden or the reader factory is used in a context that ignores the columnar support flag.
Common situations: Custom code wiring the row reader factory into a columnar-capable reader path; Spark extensions probing columnar support; enabling columnar read configs on a path backed by this factory.
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/6ea83d29f3c13453.
Report an issue: GitHub.