apache/iceberg · error · UnsupportedOperationException
Unsupported task group for columnar reads: +…
Error message
Unsupported task group for columnar reads: + partition.taskGroup()
What it means
createColumnarReader requires all tasks in the partition's ScanTaskGroup to be FileScanTask (regular data file reads). Other task group kinds (e.g. changelog or positional-delete-bearing groups unsupported in this factory) reach the else branch and throw UnsupportedOperationException with the task group class name.
Solutions
- Use row-based or changelog-aware readers for non-file scan groups; don't force columnar reads on streaming/changelog sources.
- Verify the scan producing the partition is a plain batch file scan.
- Align Iceberg runtime versions so task types match what this reader factory knows.
- Filter/customize Spark read path (spark.sql.iceberg.*) so columnar reads apply only to batch file scans.
Example fix
// before
df = spark.readStream.format('iceberg').load(...); df.collect() // may request columnar
// after
val rdd = df.rdd // force row-based consumption for changelog/streaming scans Defensive patterns
Strategy: type-guard
Validate before calling
// ensure the scan task group is file-scan based before columnar read
if (!partition.allTasksOfType(FileScanTask.class)) {
throw new IllegalStateException("columnar reads require FileScanTask group");
} Type guard
boolean columnarSafe(SparkInputPartition p) { return p.allTasksOfType(FileScanTask.class); } Try / catch
try { reader = factory.createColumnarReader(partition); } catch (UnsupportedOperationException e) {
reader = rowBasedReader(partition);
} Prevention
- Restrict columnar reads to plain batch file scans.
- Force row-based consumption (df.rdd) for changelog/streaming sources.
- Keep task types aligned with the runtime version in use.
When it happens
Trigger: Spark requests columnar reads for an input partition whose ScanTaskGroup contains non-FileScanTask entries — e.g. changelog scans, delete-file task groups, or custom scan task types routed to the columnar reader factory.
Common situations: Columnar read requests against streaming changelog scans; third-party/custom scan task types; version skew where newer task types appear in a group.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Row-based reads are not supported
- Batch reading is not supported in Avro reader
- Cannot add column since setting default values in Spark is…
- Cannot convert unknown expression
- Deleted rows scan task is not supported yet
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/09aa1186041ab423.
Report an issue: GitHub.
Appendix: source
Thrown at spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/source/SparkColumnarReaderFactory.java:62
@Override
public PartitionReader<InternalRow> createReader(InputPartition inputPartition) {
throw new UnsupportedOperationException("Row-based reads are not supported");
}
@Override
public PartitionReader<ColumnarBatch> createColumnarReader(InputPartition inputPartition) {
Preconditions.checkArgument(
inputPartition instanceof SparkInputPartition,
"Unknown input partition type: %s",
inputPartition.getClass().getName());
SparkInputPartition partition = (SparkInputPartition) inputPartition;
if (partition.allTasksOfType(FileScanTask.class)) {
return new BatchDataReader(partition, parquetConf, orcConf);
} else {
throw new UnsupportedOperationException(
"Unsupported task group for columnar reads: " + partition.taskGroup());
}
}
@Override
public boolean supportColumnarReads(InputPartition inputPartition) {
return true;
}
}
View on GitHub (pinned to 86d9c8fc54)