Hive常用函数总结二——开窗函数

   日期:2024-12-26    作者:s14ol 移动:http://oml01z.riyuangf.com/mobile/quote/49122.html

窗口函数又叫OLAP函数/分析函数,窗口函数兼具分组和排序功能。

Hive常用函数总结二——开窗函数

窗口函数最重要的关键字是 partition by 和 order by

具体语法如下:XXX over (partition by xxx order by xxx)

over()里面的 partition by 和 order by 都不是必选的,over()里面可以只有partition by,也可以只有order by,也可以两个都没有,需根据需求灵活运用。

创建表

 
 

sum over (partition by xxx order by xxx)

 
 

 注意

  • over()里面加 order by 表示:分组内从起点到当前行的pv累积,如,11号的pv1=10号的pv+11号的pv, 12号=10号+11号+12号
  • over()里面不加 order by 表示:将分组内所有值累加。

 
 
 

RANK():分组后,从1开始排名,遇到相同值会在名次中留下空位

DENSE_RANK():分组后,从1开始排名,遇到相同值不会留下空位

ROW_NUMBER():  分组后,从1开始排名,遇到相同值按照表中记录的顺序进行排列

NTILE的使用

需求

取数据排序后的前三分之一的数据

ntile可以看成是:把有序的数据集合平均分配到指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。

就是把组内数据分成几份

 
 

创建用户访问页面表: user_url

 
 

lag

LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值。

第一个参数为列名,第二个参数为往上第n行(可选,默认为1,第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL

 

 

lead

与lag相反

LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值。

 
 

FIRST_VALUE

取分组内排序后,截止到当前行,第一个值

 
 

  • LAST_VALUE的使用

取分组内排序后,截止到当前行,最后一个值。

 
 

如果想要取分组内排序后最后一个值,则需要变通一下

使用的是 FIRST_VALUE 的倒序取出分组内排序最后一个值

 
 

创建员工薪水表 staff_salary

 
 

CUME_DIST:小于等于当前值的行数/分组内总行数。order默认顺序 :正序

 
 

 

这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时、天、月的UV数。

创建用户访问表 user_date

 
 

GROUPING SETS的使用

grouping sets是一种将多个group by 逻辑写在一个sql语句中的便利写法。

等价于将不同维度的GROUP BY结果集进行UNION ALL。

 

:上述SQL中的GROUPING__ID,是个关键字,表示结果属于哪一个分组集合,根据grouping sets中的分组条件month,day,1是代表month,2是代表day。

 
  • CUBE的使用

根据GROUP BY的维度的所有组合进行聚合。

 
 

等价于

 
  • ROLLUP的使用

是CUBE的子集,以最左侧的维度为主,从该维度进行层级聚合。

比如,以month维度进行层级聚合

 
 

把month和day调换顺序,则以day维度进行层级聚合

 
 


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号