apache/seatunnel · error · org.apache.seatunnel.connectors.seatunnel.maxcompute.exception.MaxcomputeConnectorException

CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE

CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE

Error message

SeaTunnel type not support this type [%s] now

What it means

In resolveObject2SeaTunnel, ARRAY-typed MaxCompute values are converted element-wise; when the array's element SqlType has no mapping case in the switch, it throws MaxcomputeConnectorException(UNSUPPORTED_DATA_TYPE, 'SeaTunnel type not support this type [<SQL_TYPE>] now').

Source

Thrown at seatunnel-connectors-v2/connector-maxcompute/src/main/java/org/apache/seatunnel/connectors/seatunnel/maxcompute/util/MaxcomputeTypeMapper.java:142

            case ARRAY:
                ArrayList<Object> origArray = new ArrayList<>();
                ((ArrayList) field).iterator().forEachRemaining(origArray::add);
                SeaTunnelDataType<?> elementType = ((ArrayType<?, ?>) fieldType).getElementType();
                switch (elementType.getSqlType()) {
                    case STRING:
                        return origArray.toArray(new String[0]);
                    case BOOLEAN:
                        return origArray.toArray(new Boolean[0]);
                    case INT:
                        return origArray.toArray(new Integer[0]);
                    case BIGINT:
                        return origArray.toArray(new Long[0]);
                    case FLOAT:
                        return origArray.toArray(new Float[0]);
                    case DOUBLE:
                        return origArray.toArray(new Double[0]);
                    default:
                        throw new MaxcomputeConnectorException(
                                CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE,
                                String.format(
                                        "SeaTunnel type not support this type [%s] now",
                                        fieldType.getSqlType().name()));
                }
            case MAP:
                HashMap<Object, Object> dataMap = new HashMap<>();
                SeaTunnelDataType<?> keyType = ((MapType<?, ?>) fieldType).getKeyType();
                SeaTunnelDataType<?> valueType = ((MapType<?, ?>) fieldType).getValueType();
                HashMap<Object, Object> origDataMap = (HashMap<Object, Object>) field;
                origDataMap.forEach(
                        (key, value) ->
                                dataMap.put(
                                        resolveObject2SeaTunnel(key, keyType),
                                        resolveObject2SeaTunnel(value, valueType)));
                return dataMap;
            case ROW:
                SeaTunnelDataType<?>[] fieldTypes = ((SeaTunnelRowType) fieldType).getFieldTypes();

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Flatten or cast the column in MaxCompute SQL to a supported element type (BIGINT/STRING/DOUBLE...) before reading
  2. Change the table schema to use a supported array element type
  3. Implement the missing case in MaxcomputeTypeMapper.resolveObject2SeaTunnel (contribute upstream)
  4. Upgrade to a newer connector version that may map more types

Example fix

// before
SELECT cast(arr_col AS ARRAY<DECIMAL(38,10)>) AS arr_col FROM t
// after
SELECT transform(arr_col, x -> CAST(x AS DOUBLE)) AS arr_col FROM t
Defensive patterns

Strategy: type-guard

Validate before calling

if (fieldType.getSqlType() == SqlType.ARRAY) {
    SqlType elem = ((SeaTunnelArrayType) fieldType).getElementType().getSqlType();
    Set<SqlType> ok = EnumSet.of(SqlType.TINYINT, SqlType.SMALLINT, SqlType.INT, SqlType.BIGINT, SqlType.FLOAT, SqlType.DOUBLE);
    if (!ok.contains(elem)) throw new IllegalStateException("unsupported array element type: " + elem);
}

Type guard

static boolean isArrayElementSupported(SeaTunnelType<?> t) {
    if (!(t instanceof SeaTunnelArrayType)) return true;
    SqlType e = ((SeaTunnelArrayType<?>) t).getElementType().getSqlType();
    return e == SqlType.INT || e == SqlType.BIGINT || e == SqlType.FLOAT || e == SqlType.DOUBLE;
}

Try / catch

try { object(fieldType, value); }
catch (MaxcomputeConnectorException e) {
    if (e.getSeaTunnelErrorCode() == CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE)
        throw new MappingException("cast column to a supported type in source SQL", e);
    throw e;
}

Prevention

When it happens

Trigger: Reading a MaxCompute ARRAY column whose element type (e.g., DECIMAL, complex/nested types) has no converter in the ARRAY branch of the type mapper.

Common situations: Tables with ARRAY<DECIMAL(p,s)> or other exotic element types; schema auto-discovery pulling nested types the mapper never implemented; connector version older than the table's type usage.

Related errors


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