hive之生成唯一id
  TEZNKK3IfmPf 2023年11月12日 18 0

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

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

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

hive之生成唯一id

 hive之生成唯一id

 这样做的好处是 生成的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")

hive之生成唯一id

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

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

 hive之生成唯一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")
 hive之生成唯一id

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的会在前面。

hive之生成唯一id

 hive之生成唯一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")

hive之生成唯一id

5.通过mask_hash,

hive之生成唯一id

备注:

遇到过一个问题: 就是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就行。。

自增暂时不需要

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月14日   22   0   0 Hive
  TEZNKK3IfmPf   2023年11月14日   20   0   0 mysqlHive
  TEZNKK3IfmPf   2023年11月14日   31   0   0 Hive视图
  TEZNKK3IfmPf   2023年11月14日   21   0   0 hadoopHive
  TEZNKK3IfmPf   2024年04月26日   63   0   0 hadoopHive
TEZNKK3IfmPf