{"record":{"id":"f713b2cc4151a290","repo":"apache/iceberg","slug":"columnar-reads-are-not-supported-f713b2","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.0/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.0/spark/src/main/java/org/apache/iceberg/spark/source/SparkRowReaderFactory.java#L43-L69","documentation":"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.","triggerScenarios":"Any call to SparkRowReaderFactory.createColumnarReader, e.g. Spark requesting a columnar batch reader because supportColumnarReads was consulted for a different factory.","commonSituations":"Custom SparkScan wiring the row reader factory where Spark demands columnar batches; misconfigured batch scan implementations in custom sources built on Iceberg readers.","solutions":["Use a factory that supports columnar reads (e.g. the SparkBatchQueryReader/SparkScan columnar path) for columnar output","Ensure the scan reports supportColumnarReads=false so Spark does not request columnar readers from this factory","Wrap results as rows instead of ColumnarBatch if row-only readers are required"],"exampleFix":"// before\nreturn new SparkRowReaderFactory(); // used for columnar reads\n// after\nreturn supportsColumnar ? new SparkColumnarReaderFactory() : new SparkRowReaderFactory();","handlingStrategy":"validation","validationCode":"if (readerFactory instanceof SparkRowReaderFactory && wantColumnar) {\n  throw new IllegalArgumentException(\"Row reader factory cannot serve columnar reads\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always return false from supportColumnarReads when advertising the row reader factory","Select the reader factory based on required output type (rows vs ColumnarBatch)","Never mix reader factories across scan implementations"],"tags":["unsupported-operation","spark","columnar"],"backgroundTag":"method-not-implemented","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"}