hive之生成唯一id

本文探讨了在数据库中生成唯一ID的几种方法,包括基于ROW_NUMBER()的自增ID、根据字段生成关联ID以及应对数据变化的策略。强调了在数据变化频繁时保持ID稳定性的重要性,并指出ID字段应设为整数类型以避免排序问题。还提到了使用哈希和MD5作为唯一标识的场景,以及在Hive中处理NULL值排序的技巧。
摘要由CSDN通过智能技术生成

1.针对没有变话的一张表生成id。(表中数据固定不会增加修改)

ROW_NUMBER ()over() 针对所有数据生成自增id,即使所有数据都相同。

2.针对没有变化的表,根据字段生成自增id  注意cc11 和cc12我故意没按顺序摆放

 

 这样做的好处是 生成的id 和name产生了一点联系

3.针对表中数据经常发生变化 可能增加的数据

--原始表

create table test.cc_test_sequece_id(
name string ,
bd_date string 
)

--最终结果表
create table test.cc_test_sequece_id(
id string ,
name string ,
bd_date string 
)

insert into test.cc_test_sequece_id(name,bd_date)values("cc1","2019"),("cc2","2019"),("cc3","2019")

第一次赋予自增id  这里用这个。方便理解。

insert overwrite table test.cc_test_sequece_id_result select ROW_NUMBER ()over(),* from test.cc_test_sequece_id

 

第二次原始表数据变化了

truncate table test.cc_test_sequece_id

insert into test.cc_test_sequece_id(name,bd_date)values("cc1","2019"),("cc12","2019"),("cc2","2019"),("cc11","2019"),("cc3","2019")
 

insert overwrite table test.cc_test_sequece_id_result
select
    ROW_NUMBER ()over( order by id ) id ,name ,bd_date  --然后根据整个表赋值id 
from (
         select * from test.cc_test_sequece_id_result  --上次已经有了id的
         union all
         select null as id ,* from test.cc_test_sequece_id  t  --这次数据新增的,用null作为id
         where not EXISTS (
             select 1 from test.cc_test_sequece_id_result r
             where t.name=r.name
         )
     )t --此时这两个union后有id的会在前面。

 

 为什么不采用前面的方法直接生成id。那是因为例如cc2在第一次生成主键的时候是2

可是如果数据发生了变化下次他的id就可能是3456这种了。

2021-11-17 今天突然想到这里是有点需要注意。。。

id这个主键字段必须设置为int类型。不要string,不要string,不要string因为string 的排序规则是

1,11,12,13...111,112,113....2,21,22.. 你在order by的时候会打乱顺序的

4.通过hash,仅供参考,按照java说的 数据太多的情况下hash值有小部分概率一样,但是可以通过hash多列 来避免,例如hash("c1","c2")

5.通过mask_hash,

备注:

遇到过一个问题: 就是id 有 1 2 3 4 null null的时候,按照id排序

hive会默认是 null null 1234 和预想不对

这个时候建议加个字段  

select 

from (

        select 

        id, 

        if(id is null ,1,0) paixu

        from table

)t 

order by paixu, id

最后结果就是 1 2 3 4 null null 

新增2021-12-06

最后都没有使用上述方法。。。因为发现了hive的另外一个方法md5

直接md5(concat(col1,col2))当作唯一id就行。。

自增暂时不需要

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值