prestodb/presto · error · UnsupportedOperationException
Iceberg column type ${fieldType.typeId()} is not supported
Error message
Iceberg column type ${fieldType.typeId()} is not supported What it means
ColumnIdentity.createColumnIdentity maps Iceberg primitive field types to Presto column identities; when the field's typeId is one the connector does not recognize/translate, this NOT_SUPPORTED guard fires, meaning the table's schema contains an Iceberg type unsupported by this Presto version.
Source
Thrown at presto-iceberg/src/main/java/com/facebook/presto/iceberg/ColumnIdentity.java:185
return new ColumnIdentity(id, name, ARRAY, ImmutableList.of(elementColumn), typeAttributes);
}
if (fieldType.isStructType()) {
List<ColumnIdentity> fieldColumns = fieldType.asStructType().fields().stream()
.map(ColumnIdentity::createColumnIdentity)
.collect(toImmutableList());
return new ColumnIdentity(id, name, STRUCT, fieldColumns, typeAttributes);
}
if (fieldType.isMapType()) {
List<ColumnIdentity> keyValueColumns = fieldType.asMapType().fields().stream()
.map(ColumnIdentity::createColumnIdentity)
.collect(toImmutableList());
checkArgument(keyValueColumns.size() == 2, "Expected map type to have two fields");
return new ColumnIdentity(id, name, MAP, keyValueColumns, typeAttributes);
}
throw new UnsupportedOperationException(format("Iceberg column type %s is not supported", fieldType.typeId()));
}
// Derives the Iceberg V3 type-disambiguation attributes (ORC Appendix A
// semantics) that the format-erased Presto type cannot represent. Returns
// Optional.empty() when nothing is set, so the attribute is omitted from the
// serialized handle and column identities are unchanged for the common
// case.
//
// Only UUID and FIXED are derived today: both Iceberg types map to Presto
// VARBINARY, so the binary variant and (for FIXED) the length are
// genuinely lost without these attributes. Iceberg LONG already maps 1:1
// to Presto BIGINT (and INT to INTEGER), so a `long-type` attribute would
// be redundant; timestamp unit is always microseconds in the current
// Iceberg spec; and `iceberg.required` (nullability) is carried by the ORC
// writer path. Those fields remain on IcebergTypeAttributes so the wire
// format and the native worker are ready for them, but deriving them here
// is deferred to avoid rewriting every column identity.
private static Optional<IcebergTypeAttributes> deriveTypeAttributes(org.apache.iceberg.types.Type fieldType)View on GitHub (pinned to 55bb57d202)
Solutions
- Identify the offending column type from the Iceberg schema and change it to a supported type
- Upgrade Presto to a version supporting the newer Iceberg type (e.g. variant/nanosecond timestamps)
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at presto-iceberg/src/main/java/com/facebook/presto/iceberg/ColumnIdentity.java:185 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/8f345f2ffcc7c519.
Report an issue: GitHub.