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;

                            @Override

View on GitHub (pinned to 2f3c205e92)

Solutions

  1. Set legacyTimestampMapping=false so TIMESTAMP_LTZ maps to local-timestamp logical types.
  2. 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

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


AI-assisted analysis of apache/flink@2f3c205e92 (2026-08-14). Data as JSON: /api/errors/d0409c2c58fe322d. Report an issue: GitHub.