apache/iceberg · error · UnsupportedOperationException
does not have a metadata file location
Error message
does not have a metadata file location
What it means
SerializableTable captures a table's state for serialization (e.g., sending to executors). It only records a metadata file location when built from a table whose TableOperations exposes one. Calling metadataFileLocation() on an instance built without one throws UnsupportedOperationException, since there is no metadata file path to return.
Source
Thrown at core/src/main/java/org/apache/iceberg/SerializableTable.java:116
}
/**
* Creates a read-only serializable table that can be sent to other nodes in a cluster.
*
* @param table the original table to copy the state from
* @return a read-only serializable table reflecting the current state of the original table
*/
public static Table copyOf(Table table) {
if (table instanceof BaseMetadataTable) {
return new SerializableMetadataTable((BaseMetadataTable) table);
} else {
return new SerializableTable(table);
}
}
public String metadataFileLocation() {
if (metadataFileLocation == null) {
throw new UnsupportedOperationException(
this.getClass().getName() + " does not have a metadata file location");
}
return metadataFileLocation;
}
private String metadataFileLocation(Table table) {
if (table instanceof HasTableOperations) {
TableOperations ops = ((HasTableOperations) table).operations();
return ops.current().metadataFileLocation();
} else if (table instanceof BaseMetadataTable) {
return ((BaseMetadataTable) table).table().operations().current().metadataFileLocation();
} else {
return null;
}
}
private Table lazyTable() {
if (lazyTable == null) {View on GitHub (pinned to 86d9c8fc54)
Solutions
- Check that the underlying table was loaded from a real catalog entry with a metadata file before serializing
- Call metadataFileLocation() only on the original Table, not the SerializableTable wrapper
- Re-read the table from its catalog to get a fresh instance with a metadata location
Example fix
// before SerializableTable st = SerializableTable.of(table); String loc = st.metadataFileLocation(); // after String loc = table.operations().current().metadataFileLocation();
Defensive patterns
Strategy: type-guard
Validate before calling
if (table instanceof SerializableTable) { throw new IllegalStateException("Call metadataFileLocation on the live table"); } Type guard
boolean hasMetadataLocation = !(table instanceof SerializableTable) || table.operations() != null;
Try / catch
try { loc = st.metadataFileLocation(); } catch (UnsupportedOperationException e) { loc = table.operations().current().metadataFileLocation(); } Prevention
- Fetch metadata location from the original Table/TableOperations, not the serialized wrapper
- Only serialize catalog-loaded tables
When it happens
Trigger: Calling metadataFileLocation() on a SerializableTable created via SerializableTable.of() from a table whose operations did not provide a metadata file location (e.g., an in-memory/static table without a backing metadata file).
Common situations: Driver-side code inspecting a table after it was serialized for distributed execution; tables loaded via StaticTableOperations with a null metadata location.
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
- does not have a format version
- 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
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/e67402243ba73f92.
Report an issue: GitHub.