apache/iceberg · error · UnsupportedOperationException
Unsupported task group for columnar reads
Error message
Unsupported task group for columnar reads: ${partition.taskGroup()} What it means
createColumnarReader can only build a BatchDataReader when every task in the input partition is a FileScanTask. If the partition's task group contains other task types (e.g. tasks from metadata scans or mixed groups that lack per-file columnar metadata), columnar reading is impossible and the factory throws UnsupportedOperationException naming the offending task group.
Solutions
- Check partition.allTasksOfType(FileScanTask.class) before requesting columnar reads and fall back to a non-columnar reader otherwise
- Honor supportColumnarReads(inputPartition) in the execution layer and use a row-based factory when it returns false
- Restrict columnar batch reads to pure data-file scans; handle metadata-table scans separately
Example fix
// before
return factory.createColumnarReader(partition);
// after
if (partition.allTasksOfType(FileScanTask.class)) {
return factory.createColumnarReader(partition);
} else {
return rowFactory.createReader(partition);
} Defensive patterns
Strategy: validation
Validate before calling
Preconditions.checkState(partition.allTasksOfType(FileScanTask.class),
"Columnar reads require all FileScanTask, got: " + partition.taskGroup()); Type guard
boolean columnarCapable = partition.allTasksOfType(FileScanTask.class);
Try / catch
try {
return factory.createColumnarReader(partition);
} catch (UnsupportedOperationException e) {
return rowFactory.createReader(partition);
} Prevention
- Check allTasksOfType(FileScanTask.class) before columnar dispatch
- Handle metadata-table scans with a row-based reader
- Respect supportColumnarReads(inputPartition) in execution code
When it happens
Trigger: Calling createColumnarReader with a SparkInputPartition whose taskGroup() is not all FileScanTask (e.g. a metadata-file scan task group, or mixed DeleteFile/FileScanTask groups) while supportColumnarReads was overridden or bypassed.
Common situations: Query plans that include metadata-table scans (refs, entries, files) routed to the columnar factory; custom batch execution frameworks that don't consult supportColumnarReads before dispatching; mixed batch/stream task groups.
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
- Unsupported task group for columnar reads: " +…
- Already closed files for partition:
- ALTER TABLE contains multiple distribution clauses
- ALTER TABLE contains multiple distribution clauses
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/b32a543120358b2d.
Report an issue: GitHub.
Appendix: source
Thrown at spark/v4.2/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)