apache/flink · error · IllegalArgumentException

Unsupported type '%s' for field '%s'.

Error message

Unsupported type '%s' for field '%s'.

What it means

Thrown by CsvRowSchemaConverter.convertType(fieldName, LogicalType) when a field's LogicalType root is not among CSV-supported roots (numbers, strings, booleans, ARRAY of simple types, ROW of simple types, BYTES-as-string). MAP, MULTISET, RAW, and other complex roots fall to the default branch and abort schema construction with IllegalArgumentException.

Source

Thrown at flink-formats/flink-csv/src/main/java/org/apache/flink/formats/csv/CsvRowSchemaConverter.java:229

     */
    private static CsvSchema.ColumnType convertType(String fieldName, LogicalType type) {
        if (STRING_TYPE_ROOTS.contains(type.getTypeRoot())) {
            return CsvSchema.ColumnType.STRING;
        } else if (NUMBER_TYPE_ROOTS.contains(type.getTypeRoot())) {
            return CsvSchema.ColumnType.NUMBER;
        } else if (BOOLEAN_TYPE_ROOTS.contains(type.getTypeRoot())) {
            return CsvSchema.ColumnType.BOOLEAN;
        } else if (type.getTypeRoot() == LogicalTypeRoot.ARRAY) {
            validateNestedField(fieldName, ((ArrayType) type).getElementType());
            return CsvSchema.ColumnType.ARRAY;
        } else if (type.getTypeRoot() == LogicalTypeRoot.ROW) {
            RowType rowType = (RowType) type;
            for (LogicalType fieldType : rowType.getChildren()) {
                validateNestedField(fieldName, fieldType);
            }
            return CsvSchema.ColumnType.ARRAY;
        } else {
            throw new IllegalArgumentException(
                    "Unsupported type '"
                            + type.asSummaryString()
                            + "' for field '"
                            + fieldName
                            + "'.");
        }
    }

    private static void validateNestedField(String fieldName, TypeInformation<?> info) {
        if (!NUMBER_TYPES.contains(info)
                && !STRING_TYPES.contains(info)
                && !BOOLEAN_TYPES.contains(info)) {
            throw new IllegalArgumentException(
                    "Only simple types are supported in the second level nesting of fields '"
                            + fieldName
                            + "' but was: "
                            + info);
        }

View on GitHub (pinned to 2f3c205e92)

Solutions

  1. Remove or transform the MAP/MULTISET/RAW column: cast to STRING, or explode/flatten it into scalar columns.
  2. Use 'json' or 'avro' format if the payload genuinely needs maps and multisets.
  3. For ARRAY columns, ensure element types are simple (number/string/boolean) — no arrays of rows.

Example fix

-- before
CREATE TABLE t (id INT, attrs MAP<STRING,INT>) WITH ('format'='csv', ...);

-- after
CREATE TABLE t (id INT, attrs STRING) WITH ('format'='csv', ...);
Defensive patterns

Strategy: type-guard

Validate before calling

// Mirror of the converter's accepted roots:
static final Set<LogicalTypeRoot> OK = Set.of(/* numbers */ INTEGER, BIGINT, FLOAT, DOUBLE, DECIMAL,
    /* strings */ CHAR, VARCHAR, /* bool */ BOOLEAN, /* binary */ BINARY, VARBINARY,
    /* temporal */ DATE, TIME_WITHOUT_TIME_ZONE, TIMESTAMP_WITHOUT_TIME_ZONE,
    TIMESTAMP_WITH_LOCAL_TIME_ZONE, ARRAY, ROW);
boolean csvRepresentable(LogicalType t) {
    return OK.contains(t.getTypeRoot());
}

Type guard

static boolean isCsvSupportedType(LogicalType t) {
    switch (t.getTypeRoot()) {
        case MAP: case MULTISET: case RAW: return false;
        default: return true;
    }
}

Prevention

When it happens

Trigger: A table DDL with a column of type MAP<..,..>, MULTISET<..>, or an obscure type whose root is not covered; ARRAY<ROW<...>> (nested complex inside array) also reaches here indirectly via nested validation.

Common situations: Designing a CSV sink/source table by copying a JSON-format table that legitimately has MAP columns; SQL functions producing RAW-typed columns piped into CSV.

Related errors


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