{"record":{"id":"14dfb08abbcf4f67","repo":"apache/iceberg","slug":"unsupported-changelog-scan-task-type-task-getcl-14dfb0","errorCode":null,"errorMessage":"Unsupported changelog scan task type: + task.getClass().getName()","messagePattern":"Unsupported changelog scan task type: \\+ task\\.getClass\\(\\)\\.getName\\(\\)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/source/ChangelogRowReader.java","lineNumber":114,"sourceCode":"    metadataRow.update(0, UTF8String.fromString(task.operation().name()));\n    metadataRow.update(1, task.changeOrdinal());\n    metadataRow.update(2, task.commitSnapshotId());\n\n    return metadataRow;\n  }\n\n  private CloseableIterable<InternalRow> openChangelogScanTask(ChangelogScanTask task) {\n    if (task instanceof AddedRowsScanTask) {\n      return openAddedRowsScanTask((AddedRowsScanTask) task);\n\n    } else if (task instanceof DeletedRowsScanTask) {\n      throw new UnsupportedOperationException(\"Deleted rows scan task is not supported yet\");\n\n    } else if (task instanceof DeletedDataFileScanTask) {\n      return openDeletedDataFileScanTask((DeletedDataFileScanTask) task);\n\n    } else {\n      throw new IllegalArgumentException(\n          \"Unsupported changelog scan task type: \" + task.getClass().getName());\n    }\n  }\n\n  CloseableIterable<InternalRow> openAddedRowsScanTask(AddedRowsScanTask task) {\n    String filePath = task.file().location();\n    SparkDeleteFilter deletes = new SparkDeleteFilter(filePath, task.deletes(), counter(), true);\n    return deletes.filter(rows(task, deletes.requiredSchema()));\n  }\n\n  private CloseableIterable<InternalRow> openDeletedDataFileScanTask(DeletedDataFileScanTask task) {\n    String filePath = task.file().location();\n    SparkDeleteFilter deletes =\n        new SparkDeleteFilter(filePath, task.existingDeletes(), counter(), true);\n    return deletes.filter(rows(task, deletes.requiredSchema()));\n  }\n\n  private CloseableIterable<InternalRow> rows(ContentScanTask<DataFile> task, Schema readSchema) {","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/source/ChangelogRowReader.java#L96-L132","documentation":"openChangelogScanTask throws IllegalArgumentException when the ChangelogScanTask subtype matches none of the known classes (AddedRowsScanTask, DeletedRowsScanTask, DeletedDataFileScanTask). This signals a task type introduced by a newer Iceberg core that this Spark reader doesn't know.","triggerScenarios":"A changelog scan produces a task type unrecognized by the installed Spark integration — typically after mixing Iceberg runtime versions (core newer than spark module) or custom ChangelogScanTask implementations.","commonSituations":"Version skew: iceberg-core upgraded but iceberg-spark-runtime not; custom forks adding scan task types; classpath containing two Iceberg versions.","solutions":["Align all Iceberg dependencies to one version — use the shaded iceberg-spark-runtime jar only.","Check classpath for duplicate/conflicting iceberg jars (spark.jars.packages, conf).","Remove custom ChangelogScanTask implementations or add support for them in the reader.","Report/reproduce with the task class name from the message to identify the producing version."],"exampleFix":"// before\n--packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.0,org.apache.iceberg:iceberg-core:1.7.0\n// after\n--packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.7.0","handlingStrategy":"type-guard","validationCode":"// verify a single aligned Iceberg runtime before starting the job\nString v = org.apache.iceberg.IcebergBuild.version();\nassert Class.forName(\"org.apache.iceberg.spark.source.ChangelogRowReader\") != null;","typeGuard":"// narrow task types before reading\nif (!(task instanceof AddedRowsScanTask) && !(task instanceof DeletedDataFileScanTask)) {\n  throw new IllegalStateException(\"unsupported task type, upgrade runtime: \" + task.getClass().getName());\n}","tryCatchPattern":"try { read(); } catch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Unsupported changelog scan task type\")) failFastWithVersionReport(e);\n  else throw e;\n}","preventionTips":["Use only the shaded iceberg-spark-runtime jar; exclude transitive iceberg-core.","Run `mvn dependency:tree`/`gradle dependencies` to detect duplicate Iceberg versions.","Upgrade writer and reader in lockstep."],"tags":["spark","changelog","version-skew","type-dispatch"],"backgroundTag":"invalid-enum-value","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"}