{"record":{"id":"561f6b5c6d7eaa79","repo":"apache/iceberg","slug":"unsupported-task-group-for-row-based-reads-pa","errorCode":null,"errorMessage":"Unsupported task group for row-based reads: \" + partition.taskGroup()","messagePattern":"Unsupported task group for row-based reads: \" \\+ partition\\.taskGroup\\(\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/source/SparkRowReaderFactory.java","lineNumber":54,"sourceCode":"  public PartitionReader<InternalRow> createReader(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 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":36,"sourceCodeEnd":69,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/source/SparkRowReaderFactory.java#L36-L69","documentation":"SparkRowReaderFactory.createReader can build row readers for mixed/regular tasks, changelog tasks, and all-position-deletes task groups. If the partition's tasks are some other group, it throws UnsupportedOperationException since no row reader exists for that combination.","triggerScenarios":"Row-based (non-columnar) reading of a partition whose ScanTaskGroup contains task types other than the supported ones (e.g. unexpected task group mixing file/deletion task types not handled by the if/else chain).","commonSituations":"New Iceberg scan task kinds read by an older Spark reader factory; custom scan tasks injected into planning; reading with row-based filters on changelog/position-delete tables with unexpected task compositions.","solutions":["Use columnar reads or the standard batch read path that matches the task group.","Align Spark and Iceberg versions so task types match the factory's supported set.","Inspect the query plan to see which task types are produced and avoid reading them row-based.","Upgrade Iceberg if a newly added task type needs row-reader support."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"boolean rowReadable = partition.allTasksOfType(PositionDeletesScanTask.class) || partition.allTasksOfType(ChangelogScanTask.class) || /* mixed-regular supported */ true;","typeGuard":null,"tryCatchPattern":"try { return factory.createReader(partition); } catch (UnsupportedOperationException e) { return factory.createColumnarReader(partition); /* or fail fast */ }","preventionTips":["Match reader factory to the scan task types produced","Keep Iceberg and Spark versions consistent","Avoid custom ScanTask implementations in partitions read row-based"],"tags":["unsupported-operation","spark","row-based-reads"],"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-23T08:17:48.524Z"}