hive 自增id hive添加自增序列 - 文章中心
hive 自增id hive添加自增序列
2024-12-27






写在前面:最近在苦兮兮得用Hive搬砖,想起来还有这么一个“年更”的号。嘿,那就再搬一篇吧。

本农民工习惯使用的是pandas,平常会使用到mysql最基本的用法,最多的时候就是“select * from table1”,万事大吉。无奈供应商只提供了Hive的查询平台,还有数据导出的条数限制。emmmmm,,,,好的吧,我学还不行吗。

Hive版本:未知(没有“hive -version”这种用法),目测不是最新。

1、自增序列 & top N

2、【窗口函数】前一次/后一次

3、not in (子查询)

4、一列变多行

一、自增序列 & top N

需求:增加一列自增序列,作为行的index。

hive 支持的索引机制和mysql不同,比较复杂,太难不看。

工具:row_number()



涉及排序的问题,我们需要考虑到遇到“相同值“的情况,如何显示排名

例如,遇到并列第1的情况

工具:

hive 自增id hive添加自增序列

row_number(),不管是否相同,顺序排序。

例如输出名次: 1,2,3,4

rank(),相同的排序是一样的,但下一个不同值是跳着排序的。

例如输出名次,1,1,3,4

dense_rank(),相同的排序是一样的,且名次是连续的

例如输出名次,1,1,2,3

语句都类似,



工具:rank() + partition by

举例,提取每月gmv top5 的城市



其中,



表示,将原数据按照months月度分组后,每组order by gmv 倒序排列,最后row number()给出一个排名。

lead函数是跟偏移量相关的分析函数,它可以在一次查询中取出同一字段的后N行的数据作为独立的列,从而更方便地进行进行数据过滤。

例如,获取当前记录的id,以及下一条记录的id (引用参考资料1)



lead(字段,N,默认)

用lead函数指定要偏移的【字段】,并指定向后偏移【N】行

若没有符合条件的数据,则输出【默认】值。

结合上 partition by,我们可以解决更复杂的问题。

举例:计算不同category 消费者的复购间隔。

问题解析:难点在于如何锁定同一个消费者相邻的两个订单。

下面给出一个实例,计算不同类目下,消费者复购的时间间隔。



有向后偏移,自然就有向前偏移。这时就可以用 lag函数,二者语法都是相同的。

相似的用法还有:(引自资料一)



参考资料:


Hive lag()与lead() 函数blog.csdn.net


hive 中可以使用



但是不支持子查询,例如



因此我们就要用到 left join 工具啦~~



当然还有其他的方法,例如 not exist

关于hive中not in不支持子查询的解决方法blog.csdn.net



工具:lateral view explode()

举例,原表格中每一个产品有一个功效keyword字段,是字符串的形式。

每一种产品对应了多种功效,每个功效之间用逗号连接,例如 ”美白,补水,抗衰老“

由于我们需要对功效进行统计,因此需要对keyword字段拆分,拆分到多行。



其中,



具体原理(过于难,不解释了):

lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。

  I   II   III   IV