apache/seatunnel · error · UnsupportedOperationException

Unsupported type: %s

Error message

Unsupported type: %s

What it means

DebeziumRowConverter.convert (called from getValue/parse) switches over the SeaTunnel SqlType of the target row field; any type not handled by the converter's cases reaches the default branch and throws UnsupportedOperationException 'Unsupported type'. This signals the JSON Debezium format does not implement conversion for that SeaTunnel data type.

Source

Thrown at seatunnel-formats/seatunnel-format-json/src/main/java/org/apache/seatunnel/format/json/debezium/DebeziumRowConverter.java:224

                            getValue(null, ((MapType) dataType).getValueType(), entry.getValue()));
                }
                return mapValue;
            case ROW:
                SeaTunnelRowType rowType = (SeaTunnelRowType) dataType;
                SeaTunnelRow row = new SeaTunnelRow(rowType.getTotalFields());
                for (int i = 0; i < rowType.getTotalFields(); i++) {
                    row.setField(
                            i,
                            getValue(
                                    rowType.getFieldName(i),
                                    rowType.getFieldType(i),
                                    value.has(rowType.getFieldName(i))
                                            ? value.get(rowType.getFieldName(i))
                                            : null));
                }
                return row;
            default:
                throw new UnsupportedOperationException("Unsupported type: " + sqlType);
        }
    }
}

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Change the offending column to a supported primitive type (STRING/INT/...) in the table schema
  2. Drop or exclude the unsupported column from the CDC schema
  3. Use a different format/connector that supports the type, or add a custom converter extending DebeziumRowConverter
  4. Check SeaTunnel version — newer releases may have added support; upgrade

Example fix

// before: schema declares ARRAY<STRING> column tags
// SeaTunnelRowType with ARRAY field fed to DebeziumJsonDeserializationSchema
// after: cast/simplify to STRING in source query or transform
// SELECT CAST(tags AS STRING) AS tags FROM ...
Defensive patterns

Strategy: validation

Validate before calling

// ensure every field type is converter-supported before use
for (SeaTunnelType<?> t : rowType.getFieldTypes()) {
    switch (t.getSqlType()) {
        case STRING: case INT: case BIGINT: case BOOLEAN:
        case DOUBLE: case DECIMAL: case DATE: case TIME: case TIMESTAMP:
            break;
        default:
            throw new IllegalArgumentException("Type not supported by Debezium JSON format: " + t);
    }
}

Try / catch

try {
    return converter.convert(value);
} catch (UnsupportedOperationException e) {
    throw new IllegalStateException("Schema contains type unsupported by debezium-json format: " + e.getMessage(), e);
}

Prevention

When it happens

Trigger: A SeaTunnel table schema for the Debezium JSON source declares a field type (e.g. ARRAY, MAP, ROW, or another type absent from the switch) that DebeziumRowConverter's convert method has no case for; the row is converted column by column via value(...) and hits the default branch.

Common situations: Users adding complex columns (arrays/maps/nested rows) to a CDC table read with format=debezium-json; schema evolution after upgrading SeaTunnel where a new column type is unsupported; typos in connector config producing unexpected SqlType mapping.

Related errors


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