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

  1. Check partition.allTasksOfType(FileScanTask.class) before requesting columnar reads and fall back to a non-columnar reader otherwise
  2. Honor supportColumnarReads(inputPartition) in the execution layer and use a row-based factory when it returns false
  3. 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

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


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)