{"record":{"id":"6ea83d29f3c13453","repo":"apache/iceberg","slug":"columnar-reads-are-not-supported-6ea83d","errorCode":null,"errorMessage":"Columnar reads are not supported","messagePattern":"Columnar reads are not supported","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/source/SparkRowReaderFactory.java","lineNumber":61,"sourceCode":"\n    if (partition.allTasksOfType(FileScanTask.class)) {\n      return new RowDataReader(partition);\n\n    } else if (partition.allTasksOfType(ChangelogScanTask.class)) {\n      return new ChangelogRowReader(partition);\n\n    } else if (partition.allTasksOfType(PositionDeletesScanTask.class)) {\n      return new PositionDeletesRowReader(partition);\n\n    } else {\n      throw new UnsupportedOperationException(\n          \"Unsupported task group for row-based reads: \" + partition.taskGroup());\n    }\n  }\n\n  @Override\n  public PartitionReader<ColumnarBatch> createColumnarReader(InputPartition inputPartition) {\n    throw new UnsupportedOperationException(\"Columnar reads are not supported\");\n  }\n\n  @Override\n  public boolean supportColumnarReads(InputPartition inputPartition) {\n    return false;\n  }\n}\n","sourceCodeStart":43,"sourceCodeEnd":69,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/source/SparkRowReaderFactory.java#L43-L69","documentation":"SparkRowReaderFactory is exclusively a row-based reader factory; columnar (Vectorized) reads are intentionally unsupported, and supportColumnarReads returns false. createColumnarReader throws UnsupportedOperationException if invoked anyway.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Rely on the default supportColumnarReads()=false so Spark never requests columnar reads.","Use the standard Iceberg SparkReadConf/vectoization path for columnar reads instead of this factory.","Remove custom overrides that route partitions to createColumnarReader.","For changelog/position-delete data, use row-based reads only."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (!readerFactory.supportColumnarReads(partition)) { /* request row-based reads instead */ }","typeGuard":"boolean columnarAllowed = readerFactory.supportColumnarReads(partition);","tryCatchPattern":"try { return readerFactory.createColumnarReader(partition); } catch (UnsupportedOperationException e) { return readerFactory.createReader(partition); }","preventionTips":["Always check supportColumnarReads before columnar dispatch","Use SparkRowReaderFactory only for row-based reads","Use the vectoization-capable factory for columnar reads"],"tags":["unsupported-operation","columnar","spark"],"backgroundTag":"operation-not-supported","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}