hive中几种唯一主键的选择和优劣比较

hive表是没有主键的,但在建表时最好加一个主键,方便查询。联合主键另说,其实也就可一利用联合主键来。
1.uuid
2.row_number()
例子:
insert into tbl_dim
select row_number() over (order by tbl_stg.id) + t2.sk_max, tbl_stg.*
from tbl_stg join (select coalesce(max(sk),0) sk_max from tbl_dim) t2;
注:其实就是先查旧表取最大的id值。在此基础上再进行递增加。参考这位大神文章
https://blog.youkuaiyun.com/wzy0623/article/details/53893174/
3.md5()

个人体会:
个人比较喜欢md5()方式,如果复合主键的话MD5(concat(str,str…)或concat_ws(‘连接符’,str1,str2…))。
原因如下:1.uuid太长了,随机的不利于重跑,如果别的维度表要用到此维度表主键做外键,只要重跑了会变,那么作为外键值又得改了。2.row_number()over(),数据量非常大时,会出现重复,但一张表数据量1个亿左右好问题不大。如果里面排序了,如果新加进来的数据,值又变了,如果做了外键又得改,这不是坑吗?如图,对照上一篇row_number的 所以这个也不合适。
在这里插入图片描述

md5()的话,只要里面加密的值不变怎么跑都是一样的,稳定所以和这个还是比较合适做主键的,这个因此得要去重一下,比较适合做唯一主键的。个人也比较喜欢。
参考:https://blog.youkuaiyun.com/wzy0623/article/details/53893174/

Hive 中,主键约束的处理方式与传统的关系型数据库有所不同。Hive 的设计初衷是面向大数据批处理任务,因此对主键的支持较为有限,并且主要集中在元数据层面而非实际的数据完整性保障。 ### 主键支持情况 从 Hive 2.1.0 版本开始,Hive 引入了对主键外键的基本语法支持,但这些约束并不会被强制执行[^2]。这意味着用户可以在建语句中使用 `PRIMARY KEY` 关键字,但 Hive 不会像关系型数据库那样确保主键的唯一性非空性。例如: ```sql CREATE TABLE test_pk ( id INT, name STRING, PRIMARY KEY (id) ); ``` 然而,在某些版本中(如 Hive 3.0 之前),如果尝试创建带有主键约束的时出现错误,可能是因为缺少必要的配置或语法不完整。正确的做法通常需要显式地指定约束状态,如 `DISABLE NOVALIDATE`,以明该约束仅用于优化器而不进行数据验证[^4]: ```sql CREATE TABLE test_pk ( id INT, name STRING, PRIMARY KEY (id) DISABLE NOVALIDATE ); ``` ### 主键约束的实现方式 由于 Hive 不强制执行主键约束,因此若要在逻辑上实现主键的功能(如唯一性非空性),需要依赖外部机制或手动处理。常见的方法包括: - **ETL 过程控制**:在数据加载到 Hive 之前,通过 ETL 流程中的清洗步骤来确保主键字段的唯一性非空性。 - **使用唯一索引替代**:虽然 Hive 不支持唯一索引,但可以通过创建分区或使用 `BUCKETING` 来提高查询性能并减少重复数据的可能性。 - **代理键生成**:当需要为维度或事实生成主键时,可以使用窗口函数 `ROW_NUMBER()` 或者自定义 UDF(如 `UDFRowSequence`)来模拟自增主键的行为[^5]。例如,使用 `ROW_NUMBER()` 函数生成代理键: ```sql INSERT INTO TABLE tbl_dim SELECT ROW_NUMBER() OVER (ORDER BY t1.id) + COALESCE(t2.sk_max, 0), t1.* FROM tbl_stg t1 CROSS JOIN (SELECT COALESCE(MAX(sk), 0) AS sk_max FROM tbl_dim) t2; ``` ### 总结 Hive主键的支持主要是为了兼容其他数据库系统的 DDL 语法以及便于迁移工具的理解。实际应用中,应根据具体需求选择合适的策略来保证数据的一致性完整性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值