Hive窗口函数CUME_DIST、PERCENT_RANK入门
现有 hive 表 cookie3, 内容如下:
hive> select * from cookie3;
d1 user1 1000
d1 user2 2000
d1 user3 3000
d2 user4 4000
d2 user5 5000
cume_dist:求小于(或大于)等于当前值的行数/分组内总行数
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
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
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
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...)