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

  • 相关阅读:
    矩阵快速幂 ZOJ 3497 Mistwald
    线段树(多棵) HDOJ 4288 Coder
    线段树(区间操作) POJ 3325 Help with Intervals
    BestCoder Round #75
    BestCoder Round #74 (div.2)
    DP ZOJ 2745 01-K Code
    Java IO file文件的写入和读取及下载
    Java时间和时间戳的相互转换
    Base64编码密钥时关于换行的几个问题。
    解决IllegalBlockSizeException:last block incomplete in decryption异常
  • 原文地址:https://www.cnblogs.com/dongdone/p/5737760.html
Copyright © 2011-2022 走看看