{"record":{"id":"479c1c2460c15753","repo":"apache/iceberg","slug":"unsupported-task-group-for-row-based-reads-part-479c1c","errorCode":null,"errorMessage":"Unsupported task group for row-based reads: ${partition.taskGroup()}","messagePattern":"Unsupported task group for row-based reads: (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.2/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.2/spark/src/main/java/org/apache/iceberg/spark/source/SparkRowReaderFactory.java#L36-L69","documentation":"SparkRowReaderFactory.createReader() builds a row reader based on the composition of scan tasks in the partition: mixed/other task groups beyond ChangelogRowReader and PositionDeletesRowReader cases are rejected. It throws UnsupportedOperationException when the partition's taskGroup() is not a supported group for row-based reads (e.g. a mixture of data files and position deletes that requires a different reader).","triggerScenarios":"Reading an Iceberg table in row-based mode where the SparkInputPartition contains a task group that is neither all changelog tasks nor all PositionDeletesScanTask — e.g. mixed data + equality-deletes or combined task types after incremental scans.","commonSituations":"Incremental scans between snapshots that mix delete kinds; reading tables with v2 equality deletes combined with positional deletes; misconfigured scan type forcing row-based reads over an unsupported task mix.","solutions":["Rewrite the query to avoid the incremental/mixed scan producing the unsupported task group (e.g. scan a single snapshot)","Switch the read to columnar mode, which supports broader task groups","Upgrade Iceberg; newer versions support more task-group combinations in row reads","If issuing incremental scans, ensure start/end snapshots don't span a delete-format change"],"exampleFix":"// before\nspark.read.format(\"iceberg\").option(\"scan-task-group\", \"row\")... // mixed tasks fail\n// after\nspark.read.format(\"iceberg\").load(\"db.tbl\") // default planning picks a supported reader","handlingStrategy":"type-guard","validationCode":"boolean rowReadSafe = partition != null && (partition.allTasksOfType(ChangelogScanTask.class) || partition.allTasksOfType(PositionDeletesScanTask.class));","typeGuard":"boolean isRowReadable(InputPartition p) { return p instanceof SparkInputPartition s && (s.partition().allTasksOfType(PositionDeletesScanTask.class) || isChangelogGroup(s.partition())); }","tryCatchPattern":"try { reader = factory.createReader(partition); } catch (UnsupportedOperationException e) { // fall back to default planning/columnar read  }","preventionTips":["Avoid incremental scans spanning deletes-format changes in one partition","Prefer default scan planning over forcing row-based reads","Upgrade Iceberg for broader mixed-task support"],"tags":["spark","iceberg","unsupported-operation","scan-planning"],"backgroundTag":"unsupported-operation","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"}