apache/iceberg · error · UnsupportedOperationException

Columnar reads are not supported

Error message

Columnar reads are not supported

What it means

SparkRowReaderFactory never supports columnar reads; createColumnarReader unconditionally throws UnsupportedOperationException and supportColumnarReads returns false. The row reader factory exists only for row-based (Record) consumption such as changelog and position-delete reads.

Source

Thrown at spark/v4.0/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

  1. Use a factory that supports columnar reads (e.g. the SparkBatchQueryReader/SparkScan columnar path) for columnar output
  2. Ensure the scan reports supportColumnarReads=false so Spark does not request columnar readers from this factory
  3. Wrap results as rows instead of ColumnarBatch if row-only readers are required

Example fix

// before
return new SparkRowReaderFactory(); // used for columnar reads
// after
return supportsColumnar ? new SparkColumnarReaderFactory() : new SparkRowReaderFactory();
Defensive patterns

Strategy: validation

Validate before calling

if (readerFactory instanceof SparkRowReaderFactory && wantColumnar) {
  throw new IllegalArgumentException("Row reader factory cannot serve columnar reads");
}

Prevention

When it happens

Trigger: Any call to SparkRowReaderFactory.createColumnarReader, e.g. Spark requesting a columnar batch reader because supportColumnarReads was consulted for a different factory.

Common situations: Custom SparkScan wiring the row reader factory where Spark demands columnar batches; misconfigured batch scan implementations in custom sources built on Iceberg readers.

Related errors


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/f713b2cc4151a290. Report an issue: GitHub.