apache/seatunnel · error · HbaseConnectorException

UNSUPPORTED_DATA_TYPE

UNSUPPORTED_DATA_TYPE

Error message

Hbase connector does not support this column type [%s]

What it means

When writing to HBase, HbaseSinkWriter.convertColumnToBytes converts each SeaTunnel column to bytes for the configured field mapping; column types without a branch in the switch hit the default and throw HbaseConnectorException UNSUPPORTED_DATA_TYPE with 'Hbase connector does not support this column type [%s]'. The sink can only serialize the primitive types it implements.

Source

Thrown at seatunnel-connectors-v2/connector-hbase/src/main/java/org/apache/seatunnel/connectors/seatunnel/hbase/sink/HbaseSinkWriter.java:272

            case TIMESTAMP:
                LocalDateTime timestamp =
                        field instanceof LocalDateTime
                                ? (LocalDateTime) field
                                : DateTimeUtils.parse(field.toString());
                return DateTimeUtils.toString(
                                timestamp, DateTimeUtils.Formatter.YYYY_MM_DD_HH_MM_SS)
                        .getBytes(charset);
            case ARRAY:
                String arrayAsString = field.toString().replaceAll("\\[|\\]|\\s", "");
                return arrayAsString.getBytes(charset);
            case STRING:
                return field.toString().getBytes(charset);
            default:
                String errorMsg =
                        String.format(
                                "Hbase connector does not support this column type [%s]",
                                fieldType.getSqlType());
                throw new HbaseConnectorException(
                        CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE, errorMsg);
        }
    }
}

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Remove or remap complex-typed columns before the HBase sink (use a SQL transform to cast/flatten to primitives)
  2. Cast the column to a supported type (string, int, long, double, boolean, decimal, date, timestamp, bytes)
  3. Verify each entry in the sink's field mapping matches a supported column type

Example fix

// before
transform { Sql { source_table_name = "src" result_table_name = "t" query = "select * from src" } }
// after
transform { Sql { source_table_name = "src" result_table_name = "t" query = "select CAST(obj_col AS string) AS obj_col, ... from src" } }
Defensive patterns

Strategy: validation

Validate before calling

for (int i = 0; i < rowType.getTotalFields(); i++) {
    SqlType t = rowType.getFieldType(i).getSqlType();
    if (t == SqlType.MAP || t == SqlType.ARRAY || t == SqlType.ROW) {
        throw new IllegalArgumentException("Field " + rowType.getFieldName(i) + " type not supported by HBase sink");
    }
}

Type guard

static boolean isSinkWritable(SeaTunnelDataType<?> type) {
    return type instanceof BasicType || type instanceof LocalTimeType || type instanceof DecimalType || type instanceof PrimitiveByteArrayType;
}

Try / catch

try { writer.write(row); }
catch (HbaseConnectorException e) {
    if (e.getSeaTunnelErrorCode() == CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE) {
        // route row to a dead-letter queue / skip with log
    } else throw e;
}

Prevention

When it happens

Trigger: A sink column mapping references a SeaTunnel field whose SqlType has no conversion branch (e.g. MAP, ARRAY, ROW) when the writer builds row bytes via convertColumnToBytes.

Common situations: Source produced complex types (e.g. from a JSON source) piped directly into HBase sink; schema changed to add a complex field; typo in field mapping selecting the wrong column.

Related errors


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