apache/seatunnel · error · SeaTunnelRuntimeException

COMMON-17

COMMON-17

Error message

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

What it means

DefaultSeaTunnelRowDeserializer converts DynamoDB AttributeValues into Java values according to the declared SeaTunnel column type. This error is thrown in convert's default branch when the field's SeaTunnel SQL type is one the deserializer does not handle (e.g. ROW/struct or other types outside BOOLEAN/INT/STRING/BYTES/MAP/ARRAY/etc.), so the DynamoDB connector cannot map the value.

Source

Thrown at seatunnel-connectors-v2/connector-amazondynamodb/src/main/java/org/apache/seatunnel/connectors/seatunnel/amazondynamodb/serialize/DefaultSeaTunnelRowDeserializer.java:151

                } else if (attributeValue.hasSs()) {
                    List<String> datas = attributeValue.ss();
                    for (int index = 0; index < datas.size(); index++) {
                        Array.set(array, index, AttributeValue.fromS(datas.get(index)));
                    }
                } else if (attributeValue.hasNs()) {
                    List<String> datas = attributeValue.ns();
                    for (int index = 0; index < datas.size(); index++) {
                        Array.set(array, index, AttributeValue.fromS(datas.get(index)));
                    }
                } else if (attributeValue.hasBs()) {
                    List<SdkBytes> datas = attributeValue.bs();
                    for (int index = 0; index < datas.size(); index++) {
                        Array.set(array, index, AttributeValue.fromB(datas.get(index)));
                    }
                }
                return array;
            default:
                throw CommonError.convertToSeaTunnelTypeError(
                        "AmazonDynamodb", seaTunnelDataType.getSqlType().toString(), field);
        }
    }
}

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Identify the failing field and its SqlType from the error message, then change the schema to a supported type (TINYINT/SMALLINT/INT/BIGINT/DOUBLE/DECIMAL/BOOLEAN/STRING/TIME/DATE/TIMESTAMP/BYTES/MAP/ARRAY).
  2. Flatten nested struct (ROW) columns into supported types before reading from DynamoDB.
  3. Cast complex columns to STRING and parse them downstream if needed.
  4. If a type should be supported, extend DefaultSeaTunnelRowDeserializer.convert with a case for it and file an upstream issue.

Example fix

// before: unsupported ROW column in schema
SeaTunnelRowType row = ...  "nested" -> ROW_TYPE
// after: declare as string and parse downstream
"nested" -> BasicType.STRING_TYPE
Defensive patterns

Strategy: validation

Validate before calling

// Check the SeaTunnel schema types before running the DynamoDB source
for (CatalogColumn col : catalogTable.getTableSchema().getColumns()) {
    SqlType t = col.getDataType().getSqlType();
    Set<SqlType> supported = Set.of(SqlType.TINYINT, SqlType.SMALLINT, SqlType.INT, SqlType.BIGINT,
            SqlType.DOUBLE, SqlType.DECIMAL, SqlType.BOOLEAN, SqlType.STRING, SqlType.TIME,
            SqlType.DATE, SqlType.TIMESTAMP, SqlType.BYTES, SqlType.MAP, SqlType.ARRAY);
    if (!supported.contains(t)) {
        throw new IllegalArgumentException("DynamoDB deserializer does not support column '" + col.getName() + "' of type " + t);
    }
}

Type guard

boolean isDynamoDbSupportedType(SeaTunnelDataType<?> t) {
    return java.util.Set.of(SqlType.TINYINT, SqlType.SMALLINT, SqlType.INT, SqlType.BIGINT,
        SqlType.DOUBLE, SqlType.DECIMAL, SqlType.BOOLEAN, SqlType.STRING, SqlType.TIME,
        SqlType.DATE, SqlType.TIMESTAMP, SqlType.BYTES, SqlType.MAP, SqlType.ARRAY)
        .contains(t.getSqlType());
}

Try / catch

try {
    reader.read();
} catch (Exception e) {
    // message contains 'AmazonDynamodb' and the unsupported SqlType
    throw new RuntimeException("Adjust DynamoDB source schema: " + e.getMessage(), e);
}

Prevention

When it happens

Trigger: Reading from Amazon DynamoDB with a table schema that declares a column whose SeaTunnel SqlType falls through the switch (e.g. ROW, NULL, or another unmapped type), during convertRow/convert at deserialization time.

Common situations: Schema defined with nested row types or types unsupported by the DynamoDB deserializer; a catalog-to-seaTunnel type mapping producing an unexpected SqlType; version changes adding SqlTypes not covered by the switch.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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