apache/seatunnel · error · HbaseConnectorException

UNSUPPORTED_DATA_TYPE

UNSUPPORTED_DATA_TYPE

Error message

Unsupported data type {}

What it means

During HBase deserialization, a SeaTunnel column whose SqlType has no case in HBaseDeserializationFormat.deserializeValue hits the default branch and throws HbaseConnectorException with UNSUPPORTED_DATA_TYPE and message 'Unsupported data type {sqlType}'. The format layer only maps a fixed set of HBase cell bytes to SeaTunnel types; anything else cannot be converted.

Source

Thrown at seatunnel-connectors-v2/connector-hbase/src/main/java/org/apache/seatunnel/connectors/seatunnel/hbase/format/HBaseDeserializationFormat.java:96

                }
            case DOUBLE:
                return Bytes.toDouble(cell);
            case BYTES:
                return cell;
            case DATE:
                return LocalDate.parse(
                        Bytes.toString(cell), DateTimeFormatter.ofPattern(dateFormat.getValue()));
            case TIME:
                return LocalTime.parse(
                        Bytes.toString(cell), DateTimeFormatter.ofPattern(timeFormat.getValue()));
            case TIMESTAMP:
                return LocalDateTime.parse(
                        Bytes.toString(cell),
                        DateTimeFormatter.ofPattern(datetimeFormat.getValue()));
            case STRING:
                return Bytes.toString(cell);
            default:
                throw new HbaseConnectorException(
                        CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE,
                        "Unsupported data type " + typeInfo.getSqlType());
        }
    }
}

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Restrict the schema to types supported by the chosen HBase deserialization format (string, int, long, double, float, boolean, decimal, date, time, timestamp, bytes)
  2. Use the 'bytes'/STRING mapping for the column and convert downstream in a transform
  3. Check which deserialization format is configured and its supported type list

Example fix

// before
schema = { fields { cf:sq = MAP<STRING,STRING> } }
// after
schema = { fields { cf:sq = string } }
Defensive patterns

Strategy: validation

Validate before calling

Set<SqlType> supported = Set.of(STRING, INT, BIGINT, DOUBLE, FLOAT, BOOLEAN, DECIMAL, DATE, TIME, TIMESTAMP, BYTES);
for (SeaTunnelRowType.Field f : rowType.getFields()) {
    if (!supported.contains(((PrimitiveByteArrayType) ...).getSqlType())) { /* fail fast or cast */ }
}

Type guard

static boolean isSupportedHbaseType(CatalogTableColumn c) {
    return c.getColumnType() instanceof BasicType || c.getColumnType() instanceof LocalTimeType || c.getColumnType() instanceof DecimalType || c.getColumnType() instanceof PrimitiveByteArrayType;
}

Try / catch

try { row = format.deserialize(rowBytes); }
catch (HbaseConnectorException e) {
    if (e.getSeaTunnelErrorCode() == CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE) {
        // fall back to bytes / cast column
    } else throw e;
}

Prevention

When it happens

Trigger: A catalog/table schema containing a column type not handled by the switch in deserializeValue (e.g. MAP, ARRAY, or other complex types) is deserialized from HBase cells via deserialize -> deserializeValue.

Common situations: Declaring an HBase column family:qualifier as a complex type in the schema; schema drift after upstream table change; copying a schema from another connector that supports more types.

Related errors


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