apache/seatunnel · error · SeaTunnelRuntimeException

COMMON-17

COMMON-17

Error message

'<identifier>' unsupported convert type '<dataType>' of '<field>' to SeaTunnel data type.

What it means

DorisTypeConverterV2.convertArray failed to map an ARRAY column's inner element type to a SeaTunnel array type. After handling known inner types (INT variants, DATE/DATETIMEV2, LARGEINT), any unrecognized inner type throws this error.

Solutions

  1. Change the Doris column so the array element is a supported type (INT/BIGINT/DATE/DATETIMEV2/LARGEINT)
  2. Cast the array column to ARRAY<STRING> in a view and read that
  3. Upgrade SeaTunnel Doris connector for broader array inner-type support

Example fix

-- before
ARRAY<DECIMALV3(10,2)>
-- after
ARRAY<STRING>
Defensive patterns

Strategy: validation

Validate before calling

String inner = columnType.replaceAll("(?i)^array<|>$", ""); Set<String> ok = Set.of("INT","BIGINT","DATE","DATETIMEV2","LARGEINT"); if (!ok.contains(inner.toUpperCase().split("\\(")[0])) throw new IllegalStateException("unsupported Doris array inner type: " + inner);

Prevention

When it happens

Trigger: convertArray (called from convert) parses a Doris ARRAY<...> column whose extracted inner type is unsupported (e.g. ARRAY<DECIMALV3(..)> or ARRAY<JSON>) when reading Doris schema.

Common situations: Reading Doris tables with ARRAY<DECIMAL>, ARRAY<JSON>, or other newer inner types; Doris version drift between what the connector supports and the cluster's schema.

Related errors


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

Appendix: source

Thrown at seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConverterV2.java:175

                || columnInterType.equalsIgnoreCase(DORIS_STRING)) {
            builder.dataType(ArrayType.STRING_ARRAY_TYPE);
        } else if (columnInterType.toUpperCase(Locale.ROOT).startsWith(DORIS_ARRAY_DECIMAL_PRE)) {
            int[] precisionAndScale = getPrecisionAndScale(columnInterType);
            DecimalArrayType decimalArray =
                    new DecimalArrayType(
                            new DecimalType(precisionAndScale[0], precisionAndScale[1]));
            builder.dataType(decimalArray);
        } else if (columnInterType.equalsIgnoreCase(DORIS_ARRAY_DATE_INTER)
                || columnInterType.equalsIgnoreCase(DORIS_ARRAY_DATEV2_INTER)) {
            builder.dataType(ArrayType.LOCAL_DATE_ARRAY_TYPE);
        } else if (columnInterType.equalsIgnoreCase(DORIS_ARRAY_DATETIME_INTER)
                || columnInterType.equalsIgnoreCase(DORIS_ARRAY_DATETIMEV2_INTER)) {
            builder.dataType(ArrayType.LOCAL_DATE_TIME_ARRAY_TYPE);
        } else if (columnInterType.equalsIgnoreCase(DORIS_LARGEINT)) {
            DecimalArrayType decimalArray = new DecimalArrayType(new DecimalType(20, 0));
            builder.dataType(decimalArray);
        } else {
            throw CommonError.convertToSeaTunnelTypeError(IDENTIFIER, columnType, name);
        }
    }

    private static String extractArrayType(String input) {
        Pattern pattern = Pattern.compile("<(.*?)>");
        Matcher matcher = pattern.matcher(input);

        return matcher.find() ? matcher.group(1) : "";
    }

    private static String[] extractMapKeyValueType(String input) {
        String[] result = new String[2];
        input = input.replaceAll("map<", "").replaceAll("MAP<", "").replaceAll(">", "");
        String[] split = input.split(",");
        if (split.length == 4) {
            // decimal(10,2),decimal(10,2)
            result[0] = split[0] + "," + split[1];
            result[1] = split[2] + "," + split[3];

View on GitHub (pinned to cf67b549a7)