Hive窗口函数简单学习

=Start=

缘由:

简单记录一下前段时间学习到的Hive窗口函数的使用方法,方便后期使用参考。

正文:

参考解答:
一、窗口函数的定义

窗口函数也称为OLAP(Online Analytical Processing)函数,是对一组值进行操作,不需要使用Group by子句对数据进行分组,还能在同一行返回原来行的列和使用聚合函数得到的聚合列

那为什么叫窗口函数呢?因为窗口函数将表以窗口为单位进行分割,并在其中进行各种分析操作,为了让大家快速形成直观印象,才起了这样一个容易理解的名称

二、窗口函数的SQL语法

窗口函数的语法分为四个部分

  • 函数子句:指明具体操作,如sum-求和,first_value-取第一个值;
  • partition by子句:指明分区字段,如果没有,则将所有数据作为一个分区;
  • order by子句:指明了每个分区排序的字段和方式,也是可选的,没有就是按照表中的顺序;
  • 窗口子句:指明相对当前记录的计算范围,可以向上(preceding),可以向下(following),也可以使用between指明,上下边界的值,没有的话默认为当前分区。
三、窗口函数的分类

窗口函数的功能分为:计算、取值、排序、序列四种,前三种的使用场景比较常见,容易理解,最后一种(序列)的使用场景比较少。

  • 计算
    • count、sum、avg、max/min
  • 取值
    • first_value/last_value、lag/lead
  • 排序
    • rank、dense_rank、row_number、ntitle
  • 序列
    • cume_dist、percent_rank
常见用法1、分组排序取top

 

常见使用场景:

 

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/4389.html

《Hive窗口函数简单学习》上有3条评论

  1. Hive分析窗口函数(一) SUM,AVG,MIN,MAX
    http://lxw1234.com/archives/2015/04/176.htm

    如果不指定 ROWS BETWEEN 默认为从起点到当前行;
    如果不指定 ORDER BY 则将分组内所有值累加;

    根据我的实际经验来看,大部分场合是不需要在 PARTITION BY 后面添加 ORDER BY 限制的,因为这可能会对你造成困惑。

  2. Hive中如何在对某一列排序之后添加一个专门表示序号/排名的列?
    Row number functionality in Hive
    https://stackoverflow.com/questions/37476952/row-number-functionality-in-hive

    -- 下面的order by语句中记得加上desc表示逆序,否则可能和预期不太一样
    select uid, 3d_cnt, 6d_cnt, total_uid_cnt, ROW_NUMBER() OVER (ORDER BY total_uid_cnt desc) AS row_num
    from
    (select uid,
    count(distinct if(dt>'20190714',dt,'')) as 3d_cnt,
    count(distinct dt) as 6d_cnt,
    sum(cnt) as total_uid_cnt
    from log.access_log
    where
    dt between 20190712 and 20190717
    group by uid
    )x
    ;

    https://stackoverflow.com/questions/50767960/how-do-i-use-row-number-in-hive-query-to-get-the-latest-user-login

发表评论

电子邮件地址不会被公开。 必填项已用*标注