apache/seatunnel · error · IcebergConnectorException
UNSUPPORTED_DATA_TYPE
UNSUPPORTED_DATA_TYPE
Error message
Unsupported iceberg type: %s
What it means
DefaultDeserializer.convert switches over the Iceberg Types.TypeID of the source column; Iceberg types without a SeaTunnel mapping (e.g. nested/advanced type variants) fall into default and raise IcebergConnectorException with UNSUPPORTED_DATA_TYPE.
Source
Thrown at seatunnel-connectors-v2/connector-iceberg/src/main/java/org/apache/seatunnel/connectors/seatunnel/iceberg/data/DefaultDeserializer.java:152
case MAP:
Map<Object, Object> icebergMap = Map.class.cast(icebergValue);
Types.MapType icebergMapType = (Types.MapType) icebergType;
Map seatunnelMap = new HashMap();
MapType seatunnelMapType = (MapType) seaTunnelType;
for (Map.Entry entry : icebergMap.entrySet()) {
seatunnelMap.put(
convert(
icebergMapType.keyType(),
entry.getKey(),
seatunnelMapType.getKeyType()),
convert(
icebergMapType.valueType(),
entry.getValue(),
seatunnelMapType.getValueType()));
}
return seatunnelMap;
default:
throw new IcebergConnectorException(
CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE,
String.format("Unsupported iceberg type: %s", icebergType));
}
}
}
View on GitHub (pinned to cf67b549a7)
Solutions
- Change the table schema to use supported types (map exotic types to string/long via Iceberg schema evolution or a view).
- Upgrade the connector, which may add mappings for the type.
- Filter out or transform unsupported columns before reading.
- Catch IcebergConnectorException and route the row/field to a dead-letter path.
Example fix
// before // reading a UUID column directly // after ALTER TABLE t REPLACE COLUMN uuid_col TYPE STRING; -- then read as string
Defensive patterns
Strategy: validation
Validate before calling
for (Types.NestedField f : schema.columns()) {
if (!SUPPORTED_IDS.contains(f.type().typeId())) throw new IllegalStateException("Unsupported iceberg type: " + f.type());
} Type guard
boolean isSupported(IcebergType t) { return t instanceof Types.BooleanType || t instanceof Types.IntegerType || t instanceof Types.LongType || t instanceof Types.DoubleType || t instanceof Types.StringType || t instanceof Types.TimestampType || t instanceof Types.ListType || t instanceof Types.MapType || t instanceof Types.StructType; } Try / catch
try { row = deserializer.deserialize(record); } catch (IcebergConnectorException e) { log.error("Unsupported type at read: {}", e.getMessage()); } Prevention
- Inspect table schema types before ingestion
- Keep connector version updated for new Iceberg types
- Downcast exotic types (UUID etc.) to strings at write time upstream
When it happens
Trigger: Reading an Iceberg table whose schema contains a type the deserializer has no case for (certain nested/UUID/timestamp-variant configurations depending on version), during deserialize()/seatunnelFieldValue().
Common situations: Iceberg tables written by Spark/Flink with exotic types (UUID, timestamps adjusted to non-UTC zones, deep nests) read by SeaTunnel; schema drift after upstream writers add new column types.
Related errors
- UNSUPPORTED_DATA_TYPE
- Unsupported type:
- Unsupported type:
- Unsupported BYTES value type:
- UNSUPPORTED_DATA_TYPE
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/7b66feb1b1db62c1.
Report an issue: GitHub.