{"record":{"id":"09aa1186041ab423","repo":"apache/iceberg","slug":"unsupported-task-group-for-columnar-reads-parti-09aa11","errorCode":null,"errorMessage":"Unsupported task group for columnar reads: + partition.taskGroup()","messagePattern":"Unsupported task group for columnar reads: \\+ partition\\.taskGroup\\(\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/source/SparkColumnarReaderFactory.java","lineNumber":62,"sourceCode":"\n  @Override\n  public PartitionReader<InternalRow> createReader(InputPartition inputPartition) {\n    throw new UnsupportedOperationException(\"Row-based reads are not supported\");\n  }\n\n  @Override\n  public PartitionReader<ColumnarBatch> createColumnarReader(InputPartition inputPartition) {\n    Preconditions.checkArgument(\n        inputPartition instanceof SparkInputPartition,\n        \"Unknown input partition type: %s\",\n        inputPartition.getClass().getName());\n\n    SparkInputPartition partition = (SparkInputPartition) inputPartition;\n\n    if (partition.allTasksOfType(FileScanTask.class)) {\n      return new BatchDataReader(partition, parquetConf, orcConf);\n    } else {\n      throw new UnsupportedOperationException(\n          \"Unsupported task group for columnar reads: \" + partition.taskGroup());\n    }\n  }\n\n  @Override\n  public boolean supportColumnarReads(InputPartition inputPartition) {\n    return true;\n  }\n}\n","sourceCodeStart":44,"sourceCodeEnd":72,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/source/SparkColumnarReaderFactory.java#L44-L72","documentation":"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.","triggerScenarios":"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.","commonSituations":"Columnar read requests against streaming changelog scans; third-party/custom scan task types; version skew where newer task types appear in a group.","solutions":["Use row-based or changelog-aware readers for non-file scan groups; don't force columnar reads on streaming/changelog sources.","Verify the scan producing the partition is a plain batch file scan.","Align Iceberg runtime versions so task types match what this reader factory knows.","Filter/customize Spark read path (spark.sql.iceberg.*) so columnar reads apply only to batch file scans."],"exampleFix":"// before\ndf = spark.readStream.format('iceberg').load(...); df.collect() // may request columnar\n// after\nval rdd = df.rdd // force row-based consumption for changelog/streaming scans","handlingStrategy":"type-guard","validationCode":"// ensure the scan task group is file-scan based before columnar read\nif (!partition.allTasksOfType(FileScanTask.class)) {\n  throw new IllegalStateException(\"columnar reads require FileScanTask group\");\n}","typeGuard":"boolean columnarSafe(SparkInputPartition p) { return p.allTasksOfType(FileScanTask.class); }","tryCatchPattern":"try { reader = factory.createColumnarReader(partition); } catch (UnsupportedOperationException e) {\n  reader = rowBasedReader(partition);\n}","preventionTips":["Restrict columnar reads to plain batch file scans.","Force row-based consumption (df.rdd) for changelog/streaming sources.","Keep task types aligned with the runtime version in use."],"tags":["spark","vectorization","scan-task","unsupported"],"backgroundTag":"unsupported-operation","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}