apache/seatunnel · error · org.apache.seatunnel.common.exception.SeaTunnelRuntimeException

COMMON-16

COMMON-16

Error message

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

What it means

HiveTypeConvertor.covertHiveTypeToSeaTunnelType maps Hive column types to SeaTunnel types. Hive CHAR (e.g. char(n)) has no supported SeaTunnel mapping here and is rejected with COMMON-16 convertToSeaTunnelTypeError naming the connector, type, and field. Note varchar maps to STRING but char intentionally throws.

Solutions

  1. Alter the Hive table column from char(n) to string (or varchar) and re-sync metadata
  2. Change the SeaTunnel table schema/config so the field is read as string via a supported type
  3. Cast the char column in the Hive view/query feeding SeaTunnel
  4. Upgrade SeaTunnel to a version that maps char types if available

Example fix

// before
CREATE TABLE t (c CHAR(10));
// after
ALTER TABLE t CHANGE COLUMN c c STRING;
Defensive patterns

Strategy: validation

Validate before calling

// Check Hive schema for CHAR columns before running the job
SHOW CREATE TABLE my_table; -- reject any column of type CHAR(n)

Type guard

boolean hasCharColumn(java.util.List<String> hiveTypes) {
    return hiveTypes.stream().anyMatch(t -> t.trim().toLowerCase().startsWith("char("));
}

Prevention

When it happens

Trigger: Reading a Hive table whose schema contains a column of Hive type char(n) (or any type string containing 'char') during source split/schema conversion.

Common situations: Hive tables created with CHAR columns (common in legacy warehouses); partitions or tables where DDL uses char instead of string/varchar.

Related errors


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

Appendix: source

Thrown at seatunnel-connectors-v2/connector-hive/src/main/java/org/apache/seatunnel/connectors/seatunnel/hive/utils/HiveTypeConvertor.java:39

import org.apache.seatunnel.api.table.type.BasicType;
import org.apache.seatunnel.api.table.type.DecimalType;
import org.apache.seatunnel.api.table.type.PrimitiveByteArrayType;
import org.apache.seatunnel.api.table.type.SeaTunnelDataType;
import org.apache.seatunnel.common.constants.PluginType;
import org.apache.seatunnel.common.exception.CommonError;
import org.apache.seatunnel.common.utils.JsonUtils;
import org.apache.seatunnel.connectors.seatunnel.hive.config.HiveConstants;

import java.util.LinkedHashMap;

public class HiveTypeConvertor {

    public static SeaTunnelDataType<?> covertHiveTypeToSeaTunnelType(String name, String hiveType) {
        if (hiveType.contains("varchar")) {
            return BasicType.STRING_TYPE;
        }
        if (hiveType.contains("char")) {
            throw CommonError.convertToSeaTunnelTypeError(
                    HiveConstants.CONNECTOR_NAME, PluginType.SOURCE, hiveType, name);
        }
        if (hiveType.contains("binary")) {
            return PrimitiveByteArrayType.INSTANCE;
        }
        if (hiveType.contains("struct")) {
            LinkedHashMap<String, Object> fields = new LinkedHashMap<>();
            int start = hiveType.indexOf("<");
            int end = hiveType.lastIndexOf(">");
            String[] columns = hiveType.substring(start + 1, end).split(",");
            for (String column : columns) {
                String[] splits = column.split(":");
                fields.put(
                        splits[0], covertHiveTypeToSeaTunnelType(splits[0], splits[1]).toString());
            }
            return SeaTunnelDataTypeConvertorUtil.deserializeSeaTunnelDataType(
                    name, JsonUtils.toJsonString(fields));
        }

View on GitHub (pinned to cf67b549a7)