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

  1. Use row-based or changelog-aware readers for non-file scan groups; don't force columnar reads on streaming/changelog sources.
  2. Verify the scan producing the partition is a plain batch file scan.
  3. Align Iceberg runtime versions so task types match what this reader factory knows.
  4. 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

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


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)