Hive分析窗口函数之CUME_DIST和PERCENT_RANK
2016-04-04 18:00
921 查看
两个序列分析函数不是很常用,这里也介绍一下。
环境信息:
Hive版本为apache-hive-0.14.0-bin
Hadoop版本为hadoop-2.6.0
Tez版本为tez-0.7.0
1. CUME_DIST 小于等于当前值的行数/分组内总行数
创建表:
create table windows_dept
(
deptno string,
pno string,
sum_insured decimal(18,2)
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile;
数据:
G01,P001,10
G01,P002,20
G01,P003,30
G02,P004,40
G02,P005,50
G03,P006,60
G03,P007,70
G03,P008,80
G03,P009,90
G03,P010,100
加载数据到Hive表中:
LOAD DATA LOCAL INPATH '/home/hadoop/testhivedata/dept.txt' OVERWRITE INTO TABLE windows_dept;
测试:
SELECT
deptno,
pno,
sum_insured,
CUME_DIST() OVER(ORDER BY sum_insured) AS rn1,
CUME_DIST() OVER(PARTITION BY deptno ORDERBY sum_insured) AS rn2
FROM windows_dept;
结果:
deptno pno sum_insured rn1 rn2
G01 P001 10 0.1 0.3333333333333333
G01 P002 20 0.2 0.6666666666666666
G01 P003 30 0.3 1.0
G02 P004 40 0.4 0.5
G02 P005 50 0.5 1.0
G03 P006 60 0.6 0.2
G03 P007 70 0.7 0.4
G03 P008 80 0.8 0.6
G03 P009 90 0.9 0.8
G03 P010 100 1.0 1.0
分析:
rn1: 没有partition,所有数据均为1组,总行数为10,
第1行:小于等于10的行数为1,因此,1/10=0.1
第5行:小于等于50的行数为5,因此,5/10=0.5
rn2: 按照部门分组,deptno=G03的行数为5,
第6行:小于等于60的行数为1,因此,1/5=0.2
第8行:小于等于80的行数为3,因此,3/5=0.6
2. PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
SELECT
deptno,
pno,
sum_insured,
PERCENT_RANK() OVER(ORDER BY sum_insured) AS rn1, --分组内
RANK() OVER(ORDER BY sum_insured) AS rn11, --分组内RANK值
SUM(1) OVER(PARTITION BY NULL) AS rn12, --分组内总行数
PERCENT_RANK() OVER(PARTITION BY deptno ORDER BY sum_insured) AS rn2
FROM windows_dept;
结果:
deptno pno sum_insured rn1 rn11 rn12 rn2
G01 P001 10 0.0 1 10 0.0
G01 P002 20 0.1111111111111111 2 10 0.5
G01 P003 30 0.2222222222222222 3 10 1.0
G02 P004 40 0.3333333333333333 4 10 0.0
G02 P005 50 0.4444444444444444 5 10 1.0
G03 P006 60 0.5555555555555556 6 10 0.0
G03 P007 70 0.6666666666666666 7 10 0.25
G03 P008 80 0.7777777777777778 8 10 0.5
G03 P009 90 0.8888888888888888 9 10 0.75
G03 P010 100 1.0 10 10 1.0
分析:
rn1: rn1 =(rn11-1) / (rn12-1)
第一行,(1-1)/(10-1)=0/9=0
第二行,(2-1)/(10-1)=1/9=0.1111111111111111
第四行,(4-1)/(10-1)=3/4=0.3333333333333333
rn2: 按照deptno分组,deptno=G01的总行数为3
第一行,(1-1)/(3-1)=0
第二行,(2-1)/(3-1)=0.5
第三行,(3-1)/(3-1)=1
环境信息:
Hive版本为apache-hive-0.14.0-bin
Hadoop版本为hadoop-2.6.0
Tez版本为tez-0.7.0
1. CUME_DIST 小于等于当前值的行数/分组内总行数
创建表:
create table windows_dept
(
deptno string,
pno string,
sum_insured decimal(18,2)
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile;
数据:
G01,P001,10
G01,P002,20
G01,P003,30
G02,P004,40
G02,P005,50
G03,P006,60
G03,P007,70
G03,P008,80
G03,P009,90
G03,P010,100
加载数据到Hive表中:
LOAD DATA LOCAL INPATH '/home/hadoop/testhivedata/dept.txt' OVERWRITE INTO TABLE windows_dept;
测试:
SELECT
deptno,
pno,
sum_insured,
CUME_DIST() OVER(ORDER BY sum_insured) AS rn1,
CUME_DIST() OVER(PARTITION BY deptno ORDERBY sum_insured) AS rn2
FROM windows_dept;
结果:
deptno pno sum_insured rn1 rn2
G01 P001 10 0.1 0.3333333333333333
G01 P002 20 0.2 0.6666666666666666
G01 P003 30 0.3 1.0
G02 P004 40 0.4 0.5
G02 P005 50 0.5 1.0
G03 P006 60 0.6 0.2
G03 P007 70 0.7 0.4
G03 P008 80 0.8 0.6
G03 P009 90 0.9 0.8
G03 P010 100 1.0 1.0
分析:
rn1: 没有partition,所有数据均为1组,总行数为10,
第1行:小于等于10的行数为1,因此,1/10=0.1
第5行:小于等于50的行数为5,因此,5/10=0.5
rn2: 按照部门分组,deptno=G03的行数为5,
第6行:小于等于60的行数为1,因此,1/5=0.2
第8行:小于等于80的行数为3,因此,3/5=0.6
2. PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
SELECT
deptno,
pno,
sum_insured,
PERCENT_RANK() OVER(ORDER BY sum_insured) AS rn1, --分组内
RANK() OVER(ORDER BY sum_insured) AS rn11, --分组内RANK值
SUM(1) OVER(PARTITION BY NULL) AS rn12, --分组内总行数
PERCENT_RANK() OVER(PARTITION BY deptno ORDER BY sum_insured) AS rn2
FROM windows_dept;
结果:
deptno pno sum_insured rn1 rn11 rn12 rn2
G01 P001 10 0.0 1 10 0.0
G01 P002 20 0.1111111111111111 2 10 0.5
G01 P003 30 0.2222222222222222 3 10 1.0
G02 P004 40 0.3333333333333333 4 10 0.0
G02 P005 50 0.4444444444444444 5 10 1.0
G03 P006 60 0.5555555555555556 6 10 0.0
G03 P007 70 0.6666666666666666 7 10 0.25
G03 P008 80 0.7777777777777778 8 10 0.5
G03 P009 90 0.8888888888888888 9 10 0.75
G03 P010 100 1.0 10 10 1.0
分析:
rn1: rn1 =(rn11-1) / (rn12-1)
第一行,(1-1)/(10-1)=0/9=0
第二行,(2-1)/(10-1)=1/9=0.1111111111111111
第四行,(4-1)/(10-1)=3/4=0.3333333333333333
rn2: 按照deptno分组,deptno=G01的总行数为3
第一行,(1-1)/(3-1)=0
第二行,(2-1)/(3-1)=0.5
第三行,(3-1)/(3-1)=1
相关文章推荐
- 【转载】MFC的程序执行顺序
- C++智能指针
- 时光商店下载网页设计
- CodeForces 651B Beautiful Paintings
- CodeForces 651B Beautiful Paintings
- 程序猿,你为什么须要一台mac?
- PHP--仿微信, 通过登陆者用户名显示好友列表,显示头像和昵称
- CPU处理多任务——中断与轮询方式比较
- LeetCode之2_Add Two Numbers
- log4j 五分钟生成一个文件(代码)
- ImageButton和ImageView的使用
- gtk 开发实践第三篇
- HDU-1711-kmp模板
- iOS设计模式之生成器
- 如何激活webstorm 11
- 内存字节对齐
- java堆内存的划分
- 画图
- CodeForces 651 C Watchmen
- 视频编码的守望者——专访x264核心开发者“Dark Shikari”詹森·盖瑞特格拉泽