zoukankan      html  css  js  c++  java
  • Hive 窗口分析函数

    1.窗口函数

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

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

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

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

    3.FIRST_VALUE(col,false) 用于统计窗口内截止到当前行,第一个出现的值

    第一个参数为列名,第二个参数是否跳过null值(可选,默认为false)

    4.LAST_VALUE(col,false用于统计窗口内截止到当前行,最后一个出现的值

    第一个参数为列名,第二个参数是否跳过null值(可选,默认为false)

    注:实践中多个字段最终取值可以应用到LAST_VALUE,例如

    SELECT vid
    ,LAST_VALUE(a,true) OVER(partition by vid order by `time` ) a
    ,LAST_VALUE(b,true) OVER(partition by vid order by `time` ) b
    ,LAST_VALUE(c,true) OVER(partition by vid order by `time` ) c
    ,LAST_VALUE(d,true) OVER(partition by vid order by `time` ) d

    ...

    5.over子句中的partition by和order by

    over(partition by col1[,col2...] )

    over(order by by col1[,col2...] )

    over(partition by col1[,col2...]  order by by col1[,col2...] )

    6.over子句中的window子句(clause)

    OVER with a window specification. Windows can be defined separately in a WINDOW clause. Window specifications support the following formats:

    (ROWS | RANGE) BETWEEN ... PRECEDING AND ... FOLLOWING
    (ROWS | RANGE) BETWEEN ... PRECEDING AND ... PRECEDING
    (ROWS | RANGE) BETWEEN ... FOLLOWING AND ... FOLLOWING

    When ORDER BY is specified with missing WINDOW clause, the WINDOW specification defaults to RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

    When both ORDER BY and WINDOW clauses are missing, the WINDOW specification defaults to ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

    range是逻辑窗口,是指定当前行对应值的范围取值

    rows是物理窗口,即根据order by 子句排序后,取的前N行及后N行的数据计算(与当前行的值无关,只与排序后的行号相关)

    (UNBOUNDED | [num]) PRECEDING:从分区第一行头开始,则为 unbounded。 N为:相对当前行向前的偏移量
    (UNBOUNDED | [num]) FOLLOWING:到该分区结束,则为 unbounded。N为:相对当前行向后的偏移量
    CURRENT ROW:当前行,偏移量为0

    2.分析函数

    1.标准聚合函数

    • COUNT
    • SUM
    • MIN
    • MAX
    • AVG

    2.RANK 

    排名不连续

    3.DENSE_RANK

    排名连续,但是有重复,保证同一个值对应同一个排名。

    4.ROW_NUMBER

    排名连续,无重复,不保证同一个值对应同一个排名。

    5.CUME_DIST(累积分布)

     小于等于当前值的行数 与 分组内总行数的占比

    6.PERCENT_RANK

    排名百分比,RANK-1/总行数-1

    7.NTILE

    离散化分区

    函数特点数据结果(升序,桶数=2)

    RANK

    排名不连续 2,2,5 1,1,3

    DENSE_RANK

    排名连续,但是有重复 2,2,5 1,1,2
    ROW_NUMBER

    排名连续,无重复

    2,2,5 1,2,3

    CUME_DIST

    占比连续,无重复;小于等于当前值的行数 与 分组内总行数的占比 2,2,5 0.33,0.66,1.0

    PERCENT_RANK

    百分比有重复,RANK-1/总行数-1 2,2,5 .0,.0,1.0

    NTILE(n)

    等量(频)离散化,n是分桶数 2,2,2,3 1,1,2,2

    3.应用场景

    累积,均值(归一化),分组取topk,累和占比,离散化

    4.附录

    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics

  • 相关阅读:
    Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)
    CAP原则 (阿里)
    分布式系统一致性问题解决实战(阿里) 异步解耦+消息队列可作为分布式系统满足最终一致性的优秀方案
    高并发&高可用系统的常见应对策略 秒杀等-(阿里)
    Redis的内存回收策略和内存上限(阿里)
    如何保证MQ的顺序性?比如Kafka
    spring的controller默认是单例还是多例
    HashMap线程不安全的体现
    TCP的三次握手与四次挥手
    常见排序算法及对应的时间复杂度和空间复杂度
  • 原文地址:https://www.cnblogs.com/arachis/p/Hive_Window_Analysis.html
Copyright © 2011-2022 走看看