hive数据排序、和窗口函数

   日期:2024-12-27    作者:dr30z 移动:http://ljhr2012.riyuangf.com/mobile/quote/58622.html

Order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序,即使设置了多个Reduce,程序依然会按照一个Reduce进行排序)。Order by全局排序,又一个缺点,就是只有一个Reducer,会导致数据规模较大是,消耗较长的计算时间。

案例演示

 
 
 

sort by 不是全局排序,其在数据进行reducer前完成排序。使用sort by是可以指定执行的reduce的个数,对输出的数据再执行归并排序,即可得到全部结果。

案例演示

 
 
 

distribute by是控制在map端如何拆分数据给reduce端的。hive会根据distribute by 后面列,对应reducer的个数进行并发,默认是采用hash算法。sort by为每个reduce产生一个排序文件。一般情况下,distribute by经常和sort by配合使用。

案例演示

 
 
 

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是倒叙排序,不能指定排序规则。

GROUP BY用于分组

  • Hive基本内置聚合函数与GROUP BY一起使用
  • 如果没有指定GROUP BY子句,则默认聚合整个表
  • 除聚合函数外,所选的其他列也必须包含在GROUP BY中
  • GROUP BY支持使用CASE WHEN或表达式

HAVING:对GROUP BY聚合结果的条件过滤

  • 可以避免在GROUP BY之后使用子查询
  • HAVING之后可以使用表达式,但不建议使用,性能比较差

基础聚合

基础聚合函数

  • max, min, count, sum, avg
    • max(distinct col1)、avg(col2)等
  • collect_set, collect_list:返回每个组列中的对象集/列表

注意事项

  • 一般与GROUP BY一起使用(不一起使用就会都查询显示出来
  • 可应用于列或表达式
  • 对NULL的count聚合为0
    • select count(null) = 0

窗口函数是一组特殊函数

  • 扫描多个输入行来计算每个输出值,为每行数据生成一行结果
  • 可以通过窗口函数来实现复杂的计算和聚合

窗口函数语法

  • PARTITION BY类似于GROUP BY,未指定则按整个结果集
  • 只有指定ORDER BY子句之后才能进行窗口定义
  • 可同时使用多个窗口函数
  • 过滤窗口函数计算结果必须在外面一层

窗口函数功能划分

排序,聚合,分析

ROW_NUMBER()
对所有数值输出不同的序号,序号唯一连续

案例演示

 
 

RANK()
对相同数值,输出相同的序号,下一个序号跳过(1,1,3

 
 

DENSE_RANK()
对相同数值,输出相同的序号,下一个序号连续(1,1,2

 
 
 

PERCENT_RANK()
(目前排名- 1)/(总行数- 1),值相对于一组值的百分比排名

 
 
 
  • COUNT()
    • 计数,可以和DISTINCT一起用(DISTINCT 去重
  • SUM():求和
  • AVG():平均值
  • MAX()/MIN(): 最大/小值
  • 从Hive 2.1.0开始在OVER子句中支持聚合函数
  • CUME_DIST
    小于等于当前值的行数/分组内总行数
 
 
  • LEAD/LAG(col,n)
    某一列进行往前/后第n行值(n可选,默认为1)
 
 
  • FIRST_VALUE
    对该列到目前为止的首个值
 
 
  • LAST_VALUE
    到目前行为止的最后一个值
 
 
 
  • 窗口定义由[<window_clause>]子句描述

    • 用于进一步细分结果并应用分析函数
  • 支持两类窗口定义

    • 行类型窗口
    • 范围类型窗口
  • RANK、NTILE、DENSE_RANK、CUME_DIST、PERCENT_RANK、LEAD、LAG和ROW_NUMBER函数不支持与窗口子句一起使用


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


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