apache/flink · error · UnsupportedOperationException
Unsupported type: {}
Error message
Unsupported type: {} What it means
RowDataToAvroConverters.createRowDataConverter refuses TIMESTAMP_WITH_LOCAL_TIME_ZONE when legacyTimestampMapping is true: legacy mode maps only TIMESTAMP WITHOUT TIME ZONE to Avro timestamp logical types; there is no legacy Avro representation for local-zoned timestamps, so converter construction fails.
Source
Thrown at flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/RowDataToAvroConverters.java:189
};
} else {
converter =
new RowDataToAvroConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Schema schema, Object object) {
return ((TimestampData) object)
.toLocalDateTime()
.toInstant(ZoneOffset.UTC)
.toEpochMilli();
}
};
}
break;
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
if (legacyTimestampMapping) {
throw new UnsupportedOperationException("Unsupported type: " + type);
} else {
converter =
new RowDataToAvroConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Schema schema, Object object) {
return ((TimestampData) object).toInstant().toEpochMilli();
}
};
}
break;
case DECIMAL:
converter =
new RowDataToAvroConverter() {
private static final long serialVersionUID = 1L;
@OverrideView on GitHub (pinned to 2f3c205e92)
Solutions
- Set legacyTimestampMapping=false so TIMESTAMP_LTZ maps to local-timestamp logical types.
- Or drop/convert the TIMESTAMP_LTZ column (CAST to TIMESTAMP or STRING) before the Avro sink if legacy mode must stay on.
Example fix
-- before: table has ts_ltz TIMESTAMP(3) WITH LOCAL TIME ZONE, legacy mapping on -- after: either disable legacy mapping in format options, or SELECT CAST(ts_ltz AS TIMESTAMP(3)) AS ts FROM src;
Defensive patterns
Strategy: validation
Validate before calling
boolean hasLtz = rowType.getFields().stream()
.anyMatch(f -> f.getType().is(LogicalTypeRoot.TIMESTAMP_WITH_LOCAL_TIME_ZONE));
if (hasLtz && legacyTimestampMapping) {
throw new IllegalArgumentException("Cannot serialize TIMESTAMP_LTZ with legacy Avro mapping; disable it or cast the column");
} Type guard
static boolean ltzSerializable(RowType t, boolean legacy) {
return !legacy || t.getFields().stream()
.noneMatch(f -> f.getType().is(LogicalTypeRoot.TIMESTAMP_WITH_LOCAL_TIME_ZONE));
} Prevention
- Default legacy mapping to false; only enable after confirming no LTZ columns exist.
- CAST TIMESTAMP_LTZ to STRING/TIMESTAMP before Avro sinks when legacy mode is mandatory.
When it happens
Trigger: Serializing RowData that contains a TIMESTAMP_WITH_LOCAL_TIME_ZONE column to Avro while avro.timestamp.logical-type.mapping.legacy=true (constructor flag).
Common situations: Turning on legacy mapping for old-pipeline compatibility on tables that use CURRENT_TIMESTAMP/TIMESTAMP_LTZ columns; upgrades where the flag default changed.
Related errors
- Failed to serialize row.
- Failed to serialize schema registry.
- Unsupported type: {}
- Failed to serialize schema registry.
- Unsupported to derive Schema for type: %s
AI-assisted analysis of apache/flink@2f3c205e92 (2026-08-14).
Data as JSON: /api/errors/d0409c2c58fe322d.
Report an issue: GitHub.