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

  1. Upgrade the Spark Iceberg runtime to a version supporting the manifest content type present in the table.
  2. Exclude/rewrite only up to a version whose manifests are all DATA/DELETES.
  3. 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

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


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/b78028435a913dfc. Report an issue: GitHub.