Hive窗口函数CUME_DIST、PERCENT_RANK入门
1. 数据说明
现有 hive 表 cookie3, 内容如下:
hive> select * from cookie3;
d1 user1 1000
d1 user2 2000
d1 user3 3000
d2 user4 4000
d2 user5 5000
- 其中字段意义:
dept(string), userid(string), sal(int) - 分别代表:
部门名称, 员工ID, 薪水
2. cume_dist()操作
cume_dist:求小于(或大于)等于当前值的行数/分组内总行数
(1) 统计小于等于当前薪水的人数的比例
select dept, userid, sal,
cume_dist() over(order by sal) as cume1
from cookie3;
结果:
d1 user1 1000 0.2
d1 user2 2000 0.4
d1 user3 3000 0.6
d2 user4 4000 0.8
d2 user5 5000 1.0
(2) 按部门分组统计小于等于当前薪水的人数的比例
select dept, userid, sal,
cume_dist() over(partition by dept order by sal) as cume2
from cookie3;
结果:
d1 user1 1000 0.3333333333333333
d1 user2 2000 0.6666666666666666
d1 user3 3000 1.0
d2 user4 4000 0.5
d2 user5 5000 1.0
(3) 按照sal降序排序后,结果就是统计大于等于当前薪水的人数的比例
select dept, userid, sal,
cume_dist() over(order by sal desc) as cume3
from cookie3;
结果:
d2 user5 5000 0.2
d2 user4 4000 0.4
d1 user3 3000 0.6
d1 user2 2000 0.8
d1 user1 1000 1.0
select dept, userid, sal,
cume_dist() over(partition by dept order by sal desc) as cume4
from cookie3;
结果:
d1 user3 3000 0.3333333333333333
d1 user2 2000 0.6666666666666666
d1 user1 1000 1.0
d2 user5 5000 0.5
d2 user4 4000 1.0
3. percent_rank操作
percent_rank:(分组内当前行的rank值-1)/(分组内总行数-1)
select dept, userid, sal,
percent_rank() over(order by sal) as pr1
from cookie3;
结果分析:
d1 user1 1000 0.0 (1-1)/(5-1)=0.0
d1 user2 2000 0.25 (2-1)/(5-1)=0.25
d1 user3 3000 0.5 (3-1)/(5-1)=0.5
d2 user4 4000 0.75 (4-1)/(5-1)=0.75
d2 user5 5000 1.0 (5-1)/(5-1)=1.0
select dept, userid, sal,
percent_rank() over(partition by dept order by sal) as pr2
from cookie3;
结果分析:
d1 user1 1000 0.0 (1-1)/(3-1)=0.0
d1 user2 2000 0.5 (2-1)/(3-1)=0.5
d1 user3 3000 1.0 (3-1)/(3-1)=1.0
d2 user4 4000 0.0 (1-1)/(2-1)=0.0
d2 user5 5000 1.0 (2-1)/(2-1)=1.0
注意:CUME_DIST、PERCENT_RANK均不支持WINDOW子句(between…and…)