HIVE分析窗口函数: CUME_DIST,PERCENT_RANK

本文转载自:lxw的大数据田地 » Hive分析窗口函数(三) CUME_DIST,PERCENT_RANK

注意: 序列函数不支持WINDOW子句。(什么是WINDOW子句,点此查看前面的文章 

Hive版本为 apache-hive-0.13.1

数据准备:

 
 
  1. d1,user1,1000
  2. d1,user2,2000
  3. d1,user3,3000
  4. d2,user4,4000
  5. d2,user5,5000
  6.  
  7. CREATE EXTERNAL TABLE lxw1234 (
  8. dept STRING,
  9. userid string,
  10. sal INT
  11. ) ROW FORMAT DELIMITED
  12. FIELDS TERMINATED BY ','
  13. stored as textfile location '/tmp/lxw11/';
  14.  
  15.  
  16. hive> select * from lxw1234;
  17. OK
  18. d1 user1 1000
  19. d1 user2 2000
  20. d1 user3 3000
  21. d2 user4 4000
  22. d2 user5 5000

CUME_DIST

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

 
 
  1. SELECT
  2. dept,
  3. userid,
  4. sal,
  5. CUME_DIST() OVER(ORDER BY sal) AS rn1,
  6. CUME_DIST() OVER(PARTITION BY dept ORDER BY sal) AS rn2
  7. FROM lxw1234;
  8.  
  9. dept userid sal rn1 rn2
  10. -------------------------------------------
  11. d1 user1 1000 0.2 0.3333333333333333
  12. d1 user2 2000 0.4 0.6666666666666666
  13. d1 user3 3000 0.6 1.0
  14. d2 user4 4000 0.8 0.5
  15. d2 user5 5000 1.0 1.0
  16.  
  17. rn1: 没有partition,所有数据均为1组,总行数为5
  18. 第一行:小于等于1000的行数为1,因此,1/5=0.2
  19. 第三行:小于等于3000的行数为3,因此,3/5=0.6
  20. rn2: 按照部门分组,dpet=d1的行数为3,
  21. 第二行:小于等于2000的行数为2,因此,2/3=0.6666666666666666

PERCENT_RANK

–PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
应用场景不了解,可能在一些特殊算法的实现中可以用到吧。表示数据在整个表里面的相对位置

 
 
  1. SELECT
  2. dept,
  3. userid,
  4. sal,
  5. PERCENT_RANK() OVER(ORDER BY sal) AS rn1, --分组内
  6. RANK() OVER(ORDER BY sal) AS rn11, --分组内RANK
  7. SUM(1) OVER(PARTITION BY NULL) AS rn12, --分组内总行数
  8. PERCENT_RANK() OVER(PARTITION BY dept ORDER BY sal) AS rn2
  9. FROM lxw1234;
  10.  
  11. dept userid sal rn1 rn11 rn12 rn2
  12. ---------------------------------------------------
  13. d1 user1 1000 0.0 1 5 0.0
  14. d1 user2 2000 0.25 2 5 0.5
  15. d1 user3 3000 0.5 3 5 1.0
  16. d2 user4 4000 0.75 4 5 0.0
  17. d2 user5 5000 1.0 5 5 1.0
  18.  
  19. rn1: rn1 = (rn11-1) / (rn12-1)
  20. 第一行,(1-1)/(5-1)=0/4=0
  21. 第二行,(2-1)/(5-1)=1/4=0.25
  22. 第四行,(4-1)/(5-1)=3/4=0.75
  23. rn2: 按照dept分组,
  24. dept=d1的总行数为3
  25. 第一行,(1-1)/(3-1)=0
  26. 第三行,(3-1)/(3-1)=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值