Hive实现自增列的两种方法

多维数据仓库中的维度表和事实表一般都需要有一个代理键,作为这些表的主键,代理键一般由单列的自增数字序列构成。Hive没有关系数据库中的自增列,但它也有一些对自增序列的支持,通常有两种方法生成代理键:使用row_number()窗口函数或者使用一个名为UDFRowSequence的用户自定义函数(UDF)。


用row_number()函数生成代理键

INSERT OVERWRITE TABLE my_hive_table
select row_number() over (order by create_time asc) as id, key
from my_mid_table

 

用UDFRowSequence生成代理键

add jar viewfs://hadoop-meituan/user/hadoop-data/user_upload/weichao05_hive-contrib-3.1.0.jar;

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

INSERT OVERWRITE TABLE my_test_table
select row_sequence() as id, key
from my_mid_table

hive-contrib-3.1.0.jar中包含一个生成记录序号的自定义函数udfrowsequence。上面的语句先加载JAR包,然后创建一个名为row_sequence()的临时函数作为调用UDF的接口,这样可以为查询的结果集生成一个自增伪列。之后就和row_number()写法类似了,只不过将窗口函数row_number()替换为row_sequence()函数。

 

以上两种方法,第二种的性能要由于第一种,第一种执行慢,且当数据超过约几千万(本人经验超过4千万)时,就报内存不够的了,这个可能与hadoop的资源配置也有关系,而第二中方法在数据超过1.5亿的情况下依然能够快速运行。

 

posted @   Boblim  阅读(8153)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2017-06-09 教你u盘中毒后如何恢复被隐藏文件
点击右上角即可分享
微信分享提示