zoukankan      html  css  js  c++  java
  • hive的窗口函数cume_dist、fercent_rank

    一、cume_dist

    这两个序列分析函数不是很常用,这里也介绍一下。
    注意: 序列函数不支持WINDOW子句。

    数据准备:

    d1,user1,1000
    d1,user2,2000
    d1,user3,3000
    d2,user4,4000
    d2,user5,5000

    创建表并加载数据

    create external table user(
    dept string,
    userid string,
    sal int
    )
    row format delimited 
    fields terminated by ','
    stored as textfile 
    location '/testuser';

    验证数据:

    hive (default)> select * from user;
    OK
    user.dept    user.userid    user.sal
    d1    user1    1000
    d1    user2    2000
    d1    user3    3000
    d2    user4    4000
    d2    user5    5000
    Time taken: 0.341 seconds, Fetched: 5 row(s)

    CUME_DIST
    –CUME_DIST 小于等于当前值的行数/分组内总行数
    –比如,统计小于等于当前薪水的人数,所占总人数的比例

    select dept,userid,sal,
    cume_dist() over(order by sal) as rn1,
    cume_dist() over(partition by dept order by sal) as rn2
    from user;
    
    OK
    dept    userid    sal    rn1    rn2
    d1    user1    1000    0.2    0.3333333333333333
    d1    user2    2000    0.4    0.6666666666666666
    d1    user3    3000    0.6    1.0
    d2    user4    4000    0.8    0.5
    d2    user5    5000    1.0    1.0
    Time taken: 3.931 seconds, Fetched: 5 row(s)

    rn1: 没有partition,所有数据均为1组,总行数为5,
    第一行:小于等于1000的行数为1,因此,1/5=0.2
    第三行:小于等于3000的行数为3,因此,3/5=0.6
    rn2: 按照部门分组,dpet=d1的行数为3,
    第二行:小于等于2000的行数为2,因此,2/3=0.6666666666666666

    二、percent_rank

    –PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
    应用场景不了解,可能在一些特殊算法的实现中可以用到吧。–PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
    应用场景不了解,可能在一些特殊算法的实现中可以用到吧。

    SELECT 
    dept,
    userid,
    sal,
    PERCENT_RANK() OVER(ORDER BY sal) AS rn1,   --分组内
    RANK() OVER(ORDER BY sal) AS rn11,          --分组内RANK值
    SUM(1) OVER(PARTITION BY NULL) AS rn12,     --分组内总行数
    PERCENT_RANK() OVER(PARTITION BY dept ORDER BY sal) AS rn2 
    FROM user;
     
    dept    userid   sal    rn1    rn11     rn12    rn2
    d1      user1   1000    0.0     1       5       0.0
    d1      user2   2000    0.25    2       5       0.5
    d1      user3   3000    0.5     3       5       1.0
    d2      user4   4000    0.75    4       5       0.0
    d2      user5   5000    1.0     5       5       1.0
     

    rn1: rn1 = (rn11-1) / (rn12-1)
    第一行,(1-1)/(5-1)=0/4=0
    第二行,(2-1)/(5-1)=1/4=0.25
    第四行,(4-1)/(5-1)=3/4=0.75
    rn2: 按照dept分组,
    dept=d1的总行数为3
    第一行,(1-1)/(3-1)=0
    第三行,(3-1)/(3-1)=1

  • 相关阅读:
    Asp.Net构架(Http请求处理流程)、(Http Handler 介绍)、(HttpModule 介绍)
    JQuery中的事件(三)
    关于asp.net mvc中的httpModules 与 httpHandler
    jQuery中的CSS(二)
    JQuery选择器(一)
    JavaScript中利用Ajax 实现客户端与服务器端通信(九)
    JavaScriptDom操作与高级应用(八)
    oracle(二)V$lock 视图中ID1 , ID2 列的含义
    关于static、内部类
    oracle(一)复习起航
  • 原文地址:https://www.cnblogs.com/dongdone/p/5737760.html
Copyright © 2011-2022 走看看