apache/iceberg · error · UnsupportedOperationException
Cannot write manifest for table version: %s
Error message
Cannot write manifest for table version: %s
What it means
ManifestFiles.newWriter only supports manifest writers for table format versions 1 through 4 (via a switch); any other formatVersion falls through to this UnsupportedOperationException. It guards against writing manifests for table versions the library cannot emit.
Source
Thrown at core/src/main/java/org/apache/iceberg/ManifestFiles.java:284
int formatVersion,
PartitionSpec spec,
EncryptedOutputFile encryptedOutputFile,
Long snapshotId,
Long firstRowId,
Map<String, String> writerProperties) {
switch (formatVersion) {
case 1:
return new ManifestWriter.V1Writer(spec, encryptedOutputFile, snapshotId, writerProperties);
case 2:
return new ManifestWriter.V2Writer(spec, encryptedOutputFile, snapshotId, writerProperties);
case 3:
return new ManifestWriter.V3Writer(
spec, encryptedOutputFile, snapshotId, firstRowId, writerProperties);
case 4:
return new ManifestWriter.V4Writer(
spec, encryptedOutputFile, snapshotId, firstRowId, writerProperties);
}
throw new UnsupportedOperationException(
"Cannot write manifest for table version: " + formatVersion);
}
/**
* Returns a new {@link ManifestReader} for a {@link ManifestFile}.
*
* @param manifest a {@link ManifestFile}
* @param io a {@link FileIO}
* @param specsById a Map from spec ID to partition spec
* @return a {@link ManifestReader}
*/
public static ManifestReader<DeleteFile> readDeleteManifest(
ManifestFile manifest, FileIO io, Map<Integer, PartitionSpec> specsById) {
Preconditions.checkArgument(
manifest.content() == ManifestContent.DELETES,
"Cannot read a data manifest with a DeleteManifestReader: %s",
manifest);
InputFile file = newInputFile(io, manifest);View on GitHub (pinned to 86d9c8fc54)
Solutions
- Upgrade the Iceberg library so it supports the table's format version
- Pass formatVersion 1-4 (matching the table's format-version property) when creating writers manually
- Do not mix older clients with tables using newer format versions
Example fix
// before ManifestFiles.write(5, spec, outputFile, snapshotId); // after ManifestFiles.write(2, spec, outputFile, snapshotId);
Defensive patterns
Strategy: validation
Validate before calling
int fv = table.ops().current().formatVersion();
if (fv < 1 || fv > 4) {
throw new IllegalStateException("Unsupported format version for manifest write: " + fv);
} Try / catch
try {
ManifestFiles.write(formatVersion, spec, outputFile, snapshotId);
} catch (UnsupportedOperationException e) {
LOG.error("Format version {} not supported by this Iceberg build", formatVersion, e);
} Prevention
- Upgrade the Iceberg client to match tables using newer format versions
- Never hardcode formatVersion; read it from table metadata
- Pin client versions when sharing tables across jobs
When it happens
Trigger: Calling ManifestFiles.write or newWriter with a formatVersion outside 1-4, e.g., 0 or 5.
Common situations: Reading a table written by a newer Iceberg release supporting a higher format version with an older client; constructing writers with a hand-set formatVersion; corrupted metadata carrying an out-of-range version.
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
- Can't retrieve values from an empty struct
- Can't modify an empty struct
- %s doesn't implement cleanupLevel
- %s doesn't implement cleanExpiredMetadata
- Does not support schema getter
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/28262c7a0fbe6917.
Report an issue: GitHub.