apache/seatunnel · error · SeaTunnelRuntimeException

COMMON-17

COMMON-17

Error message

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

What it means

Lance connector's LanceTypeMapper.convertDataType() throws this when a Lance/Arrow physical type string has no mapping to a SeaTunnel data type. Struct, list and map Lance types are explicitly unimplemented (TODO), and any other unrecognized type string also lands in the default throw.

Solutions

  1. Remove or project out nested (struct/list/map) columns from the Lance dataset before reading
  2. Cast nested columns to supported primitive types
  3. Await/patch mapper support: add a case for the type in LanceTypeMapper.convertDataType()

Example fix

// before
dataset.to_table(columns=["nested_col", "id"])
// after: select only supported columns
dataset.to_table(columns=["id", "name"])
Defensive patterns

Strategy: try-catch

Try / catch

try {
    SeaTunnelDataType<?> t = mapper.convertDataType(field, lanceType);
} catch (SeaTunnelConvertException e) {
    LOG.warn("Skipping unsupported Lance type {}", lanceType.getType());
    // fallback: filter the column out of the read schema
}

Prevention

When it happens

Trigger: Reading a Lance table whose column type string (type.getType()) is not one of the mapped primitives — e.g. 'struct', 'list', 'map', or an unexpected type string.

Common situations: Reading Lance datasets containing nested/complex columns (struct/list/map) which are not yet supported by the mapper; corrupted or unusual type metadata.

Related errors


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

Appendix: source

Thrown at seatunnel-connectors-v2/connector-lance/src/main/java/org/apache/seatunnel/connectors/seatunnel/lance/data/LanceTypeMapper.java:85

            case "float64":
                return BasicType.DOUBLE_TYPE;
            case "date":
            case "date32":
            case "date64":
                return LocalTimeType.LOCAL_DATE_TYPE;
            case "time":
            case "time32":
            case "time64":
                return LocalTimeType.LOCAL_TIME_TYPE;
            case "timestamp":
                return LocalTimeType.LOCAL_DATE_TIME_TYPE;
            case "binary":
                return BasicType.BYTE_TYPE;
            case "decimal128":
                return new DecimalType(38, 10);
                // TODO: struct|list|map
            default:
                throw CommonError.convertToSeaTunnelTypeError("Lance", type.getType(), field);
        }
    }

    public JsonArrowDataType convertJsonArrowType(
            String field, @NonNull SeaTunnelDataType<?> type) {
        switch (type.getSqlType()) {
            case TINYINT:
            case SMALLINT:
            case BIGINT:
            case INT:
                JsonArrowDataType intType = new JsonArrowDataType();
                intType.setType("int32");
                return intType;
            case STRING:
                JsonArrowDataType stringType = new JsonArrowDataType();
                stringType.setType("utf8");
                return stringType;
            case MAP:

View on GitHub (pinned to cf67b549a7)