apache/seatunnel · error · SeaTunnelRuntimeException

COMMON-17

COMMON-17

Error message

'${identifier}' unsupported convert type '${dataType}' of '${field}' to SeaTunnel data type.

What it means

MaxCompute runtime type converter's convert() throws this when a column's native SqlType (from the typeDefine builder) is INTERVAL or another unmapped type. INTERmidate types like INTERVAL have no SeaTunnel equivalent mapping, so the default branch throws instead of returning a wrong type.

Solutions

  1. Cast the interval column to a supported type (e.g. BIGINT seconds or STRING) upstream
  2. Remove interval columns from the schema/SELECT list
  3. Add an INTERVAL mapping case in MaxComputeTypeConverter.convert() if a sensible representation exists

Example fix

// before: schema includes Column.of("dur", TimeIntervalType.class)
// after
Column dur = Column.of("dur", BasicType.LONG_TYPE); // store seconds
Defensive patterns

Strategy: try-catch

Try / catch

try {
    CatalogColumn col = maxComputeConverter.convert(column);
} catch (SeaTunnelConvertException e) {
    LOG.warn("Unsupported SqlType {} for column {}", column.getDataType().getSqlType(), column.getName());
    // fallback: replace with a supported representation upstream
}

Prevention

When it happens

Trigger: MaxComputeTypeConverter.convert() (also invoked via arrayColumn/keyColumn/valueColumn for nested elements) encounters a Column with SqlType INTERVAL or any type without an explicit case.

Common situations: Source schema containing interval or exotic types propagated into MaxCompute read/write paths; nested array/map element columns carrying unmapped SqlTypes.

Related errors


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

Appendix: source

Thrown at seatunnel-connectors-v2/connector-maxcompute/src/main/java/org/apache/seatunnel/connectors/seatunnel/maxcompute/datatype/MaxComputeTypeConverter.java:307

                    if (typeDefine.getLength() == null || typeDefine.getLength() <= 0) {
                        builder.columnLength(MAX_VARBINARY_LENGTH);
                    } else {
                        builder.columnLength(typeDefine.getLength());
                    }
                    builder.dataType(PrimitiveByteArrayType.INSTANCE);
                    break;
                case DATE:
                    builder.dataType(LocalTimeType.LOCAL_DATE_TYPE);
                    break;
                case DATETIME:
                case TIMESTAMP:
                case TIMESTAMP_NTZ:
                    builder.dataType(LocalTimeType.LOCAL_DATE_TIME_TYPE);
                    builder.scale(typeDefine.getScale());
                    break;
                case INTERVAL:
                default:
                    throw CommonError.convertToSeaTunnelTypeError(
                            MaxcomputeBaseOptions.PLUGIN_NAME, dataType, typeDefine.getName());
            }
        }
        return builder.build();
    }

    @Override
    public BasicTypeDefine<TypeInfo> reconvert(Column column) {
        BasicTypeDefine.BasicTypeDefineBuilder<TypeInfo> builder =
                BasicTypeDefine.<TypeInfo>builder()
                        .name(column.getName())
                        .nullable(column.isNullable())
                        .comment(column.getComment())
                        .defaultValue(column.getDefaultValue());

        switch (column.getDataType().getSqlType()) {
            case NULL:
                builder.nativeType(TypeInfoFactory.getPrimitiveTypeInfo(OdpsType.STRING));

View on GitHub (pinned to cf67b549a7)