apache/iceberg · error · UnsupportedOperationException
Unsupported manifest type: ${manifestFile.content()}
Error message
Unsupported manifest type: ${manifestFile.content()} What it means
RewriteTablePathSparkAction.toManifests handles rewriting manifests per ManifestFile.content() (DATA, DELETES); the default branch throws UnsupportedOperationException for any other content type. It guards against manifest content types the rewrite-path logic doesn't know how to relocate.
Source
Thrown at spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/actions/RewriteTablePathSparkAction.java:652
stagingLocation,
format,
sourcePrefix,
targetPrefix));
break;
case DELETES:
result.appendDeleteFile(
writeDeleteManifest(
manifestFile,
table,
deltaSnapshotIds,
stagingLocation,
format,
sourcePrefix,
targetPrefix,
rewrittenDeleteFileSizes));
break;
default:
throw new UnsupportedOperationException(
"Unsupported manifest type: " + manifestFile.content());
}
return result;
};
}
private static RewriteResult<DataFile> writeDataManifest(
ManifestFile manifestFile,
Broadcast<Table> table,
Broadcast<Set<Long>> snapshotIds,
String stagingLocation,
int format,
String sourcePrefix,
String targetPrefix) {
try {
String stagingPath =
RewriteTablePathUtil.stagingPath(manifestFile.path(), sourcePrefix, stagingLocation);
FileIO io = table.getValue().io();View on GitHub (pinned to 86d9c8fc54)
Solutions
- Upgrade the Spark Iceberg runtime to a version supporting the manifest content type present in the table.
- Exclude/rewrite only up to a version whose manifests are all DATA/DELETES.
- Rebuild the table from data files into a fresh table at the target location instead of rewriting paths in place.
Defensive patterns
Strategy: type-guard
Validate before calling
boolean safe = table.currentSnapshot().allManifests(table.io()).stream().allMatch(m -> m.content() == ManifestContent.DATA || m.content() == ManifestContent.DELETES);
Type guard
switch (manifestFile.content()) { case DATA -> ...; case DELETES -> ...; default -> handleUnknown(); } Try / catch
try { action.execute(); } catch (UnsupportedOperationException e) { if (e.getMessage().startsWith("Unsupported manifest type")) { /* upgrade runtime */ } else throw e; } Prevention
- Match runtime version to the writer version before path rewrites
- Verify manifest content types before running rewriteTablePath
When it happens
Trigger: rewriteManifests() encounters a manifest whose content() is neither DATA nor DELETES — only possible with manifests written under a newer spec/content type than this runtime supports.
Common situations: Rewriting the path of a table created/updated by a newer Iceberg release while using an older Spark runtime jar.
Related errors
- Unsupported manifest type: ${manifestFile.content()}
- Cannot convert type to SQL: %s
- Unable to build the manifest files dataframe. The end versio
- Unsupported manifest type:
- Cannot use column %s of type %s in ZOrdering, the type is un
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/b78028435a913dfc.
Report an issue: GitHub.