apache/iceberg · error · UnsupportedOperationException

Columnar reads are not supported

Error message

Columnar reads are not supported

What it means

SparkRowReaderFactory is exclusively a row-based reader factory; columnar (Vectorized) reads are intentionally unsupported, and supportColumnarReads returns false. createColumnarReader throws UnsupportedOperationException if invoked anyway.

Source

Thrown at spark/v4.1/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. Rely on the default supportColumnarReads()=false so Spark never requests columnar reads.
  2. Use the standard Iceberg SparkReadConf/vectoization path for columnar reads instead of this factory.
  3. Remove custom overrides that route partitions to createColumnarReader.
  4. For changelog/position-delete data, use row-based reads only.
Defensive patterns

Strategy: validation

Validate before calling

if (!readerFactory.supportColumnarReads(partition)) { /* request row-based reads instead */ }

Type guard

boolean columnarAllowed = readerFactory.supportColumnarReads(partition);

Try / catch

try { return readerFactory.createColumnarReader(partition); } catch (UnsupportedOperationException e) { return readerFactory.createReader(partition); }

Prevention

When it happens

Trigger: Spark calls createColumnarReader(InputPartition) on SparkRowReaderFactory, which only happens if supportColumnarReads were overridden or the reader factory is used in a context that ignores the columnar support flag.

Common situations: Custom code wiring the row reader factory into a columnar-capable reader path; Spark extensions probing columnar support; enabling columnar read configs on a path backed by this factory.

Related errors


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