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

  1. Change the table schema to use supported types (map exotic types to string/long via Iceberg schema evolution or a view).
  2. Upgrade the connector, which may add mappings for the type.
  3. Filter out or transform unsupported columns before reading.
  4. 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

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


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/7b66feb1b1db62c1. Report an issue: GitHub.