创建Apache Kudu范围分区表:Decimal类型作分区键报错求助
Apache Kudu是否支持Decimal类型作为范围分区键?
是的,Apache Kudu早期版本(如1.10及之前)不支持将Decimal类型字段用作范围分区键,这正是你触发IllegalStateException: null错误的原因。
原因说明
Kudu对范围分区键的数据类型有明确限制,仅支持可进行有序比较的基础类型:
- 整数类型(INT、BIGINT等)
- STRING
- DATE
- TIMESTAMP
Decimal类型在早期版本中未被纳入范围分区的支持范畴,即使它能作为哈希分区键或主键字段使用,结合范围分区时仍会触发兼容性错误。
解决方案
- 替换数据类型:将用作范围分区键的Decimal字段改为BigInt类型(如你成功执行的示例所示),这是最直接的兼容方案。
- 版本升级:升级Kudu到1.15及以上版本,部分新版本已扩展支持Decimal作为范围分区键,升级前需确认集群组件的兼容性。
- 类型转换:若业务必须保留Decimal类型,可将其转换为STRING类型作为范围分区键,但需注意字符串的字典序是否符合业务的数值排序需求。
报错SQL示例
drop table if exists mydb.xxx; create table if NOT EXISTS mydb.xxx ( tx_id decimal(18,0) not null , tdl_id decimal(18,0) not null , dt1 int , PRIMARY KEY(tx_id,tdl_id) ) PARTITION BY HASH(tx_id,tdl_id) PARTITIONS 22 , RANGE (tx_id ) ( partition values < 1000 , partition 1000 <= values ) stored as kudu;
成功SQL示例
drop table if exists mydb.xxx; create table if NOT EXISTS mydb.xxx ( tx_id bigint not null , tdl_id decimal(18,0) not null , dt1 int , PRIMARY KEY(tx_id,tdl_id) ) PARTITION BY HASH(tx_id,tdl_id) PARTITIONS 22 , RANGE (tx_id ) ( partition values < 1000 , partition 1000 <= values ) stored as kudu;
内容的提问来源于stack exchange,提问作者user19621400
相关产品推荐
相关产品推荐

