Hive如何实现自增序列

时间:2022-07-22
本文章向大家介绍Hive如何实现自增序列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在利用数据仓库进行数据处理时,通常有这样一个业务场景,为一个Hive表新增一列自增字段(比如事实表和维度表之间的"代理主键")。虽然Hive不像RDBMS如mysql一样本身提供自增主键的功能,但它本身可以通过函数来实现自增序列功能:利用row_number()窗口函数或者使用UDFRowSequence。

示例:table_src是我们经过业务需求处理的到的中间表数据,现在我们需要为table_src新增一列自增序列字段auto_increment_id,并将最终数据保存到table_dest中。

1. 利用row_number函数

场景1:table_dest中目前没有数据

insert into table table_destselect row_number() over(order by 1) as auto_increment_id, table_src.* from table_src;

场景2: table_dest中有数据,并且已经经过新增自增字段处理

insert into table table_destselect (row_number() over(order by 1) + dest.max_id) auto_increment_id, src.* from table_src src cross join (select max(auto_increment_id) max_id from table_dest) dest;

2. 利用UDFRowSequence

首先Hive环境要有hive-contrib相关jar包,然后执行

create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence';

针对上述场景一,可通过以下语句实现:

insert into table table_destselect row_sequence() auto_increment_id, table_src.* from table_src;

场景2实现起来也很简单,这里不在赘述。

但是,需要注意二者的区别:

row_number函数是对整个数据集做处理,自增序列在当次排序中是连续的唯一的。

UDFRowSequence是按照任务排序,但是一个SQL可能并发执行的job不止一个,而每个job都会从1开始各自排序,所以不能保证序号全局唯一。可以考虑将UDFRowSequence扩展到一个第三方存储系统中,进行序号逻辑管理,来最终实现全局的连续自增唯一序号。