apache/iceberg · error · UnsupportedOperationException
Operation newRowDelta is not supported after the table is se
Error message
Operation newRowDelta is not supported after the table is serialized
What it means
SerializableTable supports only reads/scans; commits are impossible because a serialized table has no live catalog connection. newRowDelta() creates a RowDelta operation that must commit metadata, so SerializableTable overrides it to throw UnsupportedOperationException with this message.
Source
Thrown at core/src/main/java/org/apache/iceberg/SerializableTable.java:397
@Override
public RewriteFiles newRewrite() {
throw new UnsupportedOperationException(errorMsg("newRewrite"));
}
@Override
public RewriteManifests rewriteManifests() {
throw new UnsupportedOperationException(errorMsg("rewriteManifests"));
}
@Override
public OverwriteFiles newOverwrite() {
throw new UnsupportedOperationException(errorMsg("newOverwrite"));
}
@Override
public RowDelta newRowDelta() {
throw new UnsupportedOperationException(errorMsg("newRowDelta"));
}
@Override
public ReplacePartitions newReplacePartitions() {
throw new UnsupportedOperationException(errorMsg("newReplacePartitions"));
}
@Override
public DeleteFiles newDelete() {
throw new UnsupportedOperationException(errorMsg("newDelete"));
}
@Override
public UpdateStatistics updateStatistics() {
throw new UnsupportedOperationException(errorMsg("updateStatistics"));
}
@OverrideView on GitHub (pinned to 86d9c8fc54)
Solutions
- Apply RowDelta commits through a catalog-backed table: catalog.loadTable(id).newRowDelta()...commit()
- Keep commit-producing code on the driver; ship only File handles/DataFiles to workers
- Use the engine's native merge/copy-on-write or merge-on-read sinks instead of manual RowDelta in executors
- Check table instanceof SerializableTable before issuing write operations to fail fast with clearer diagnostics
Example fix
// before Table table = serialized; table.newRowDelta().addDeletes(deleteFile).commit(); // after Table table = catalog.loadTable(identifier); table.newRowDelta().addDeletes(deleteFile).commit();
Defensive patterns
Strategy: try-catch
Validate before calling
if (table instanceof org.apache.iceberg.SerializableTable) {
throw new IllegalStateException("newRowDelta() requires a catalog-backed Table");
} Type guard
boolean canCommitDeltas = !(table instanceof org.apache.iceberg.SerializableTable);
Try / catch
try {
table.newRowDelta().addDeletes(df).commit();
} catch (UnsupportedOperationException e) {
if (e.getMessage().contains("not supported after the table is serialized")) {
catalog.loadTable(identifier).newRowDelta().addDeletes(df).commit();
} else { throw e; }
} Prevention
- Apply CDC/RowDelta commits on the driver with a live Table
- Distribute only the delete/equality files, not the Table object
- Use engine-native merge-on-read/copy-on-write sinks where possible
- Check for SerializableTable before any commit operation
When it happens
Trigger: Calling table.newRowDelta() on a deserialized SerializableTable in worker code that tries to apply deletes/inserts (e.g. CDC application inside an executor task).
Common situations: CDC/upsert jobs distributing a serialized Table to workers; custom row-delta writers built on SerializableTable; migrating driver code into executor lambdas.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Operation updateLocation is not supported after the table is
- Operation newAppend is not supported after the table is seri
- Operation newRewrite is not supported after the table is ser
- Operation rewriteManifests is not supported after the table
- Operation newOverwrite is not supported after the table is s
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/239b175a945d2c17.
Report an issue: GitHub.