大数据之Hive:Hive 开窗函数
Posted 浊酒南街
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据之Hive:Hive 开窗函数相关的知识,希望对你有一定的参考价值。
前言
书接上回,上回我们把聚合开窗函数讲完了,闲言少叙,这次我们讲解排序开窗函数;
排序开窗函数,包含row_number开窗函数,rank开窗函数,dense_rank开窗函数,ntile开窗函数和percent_rank开窗函数;
这次重点讲解row_number开窗函数,ntile开窗函数和percent_rank开窗函数;
1.row_number开窗函数
语义:从1开始对分区内的数据排序
排序类似:1,2,3,4,5。
-- row_number 开窗函数
select studentid,departmentid,classid,math,
-- 对分区departmentid,classid内的数据按math排序
row_number() over(partition by departmentid,classid order by math) as row_number
from student_scores;
结果
studentid departmentid classid math row_number
111 department1 class1 69 1
113 department1 class1 74 2
112 department1 class1 80 3
115 department1 class1 93 4
114 department1 class1 94 5
124 department1 class2 70 1
121 department1 class2 74 2
123 department1 class2 78 3
122 department1 class2 86 4
216 department2 class1 74 1
215 department2 class1 82 2
212 department2 class1 83 3
211 department2 class1 93 4
213 department2 class1 94 5
214 department2 class1 94 6
223 department2 class2 74 1
222 department2 class2 78 2
224 department2 class2 80 3
225 department2 class2 85 4
221 department2 class2 99 5
结果解释:
同一分区,相同值,不同序。如studentid=213 studentid=214 值都为94 排序为5,6。
2.rank开窗函数
同row_number开窗函数
语义:从1开始对分区内的数据排序
排序类似:1,2,2,4,5。
3.dense_rank开窗函数
同row_number开窗函数
语义:从1开始对分区内的数据排序
排序类似:1,2,2,3,4。
4.ntile开窗函数
语义:将分区中已排序的行划分为大小尽可能相等的指定数量的排名的组,并返回给定行所在的组的排名。
-- ntile 开窗函数
select *,
-- 对分区内的数据分成两组
ntile(2) over(partition by departmentid order by math) as ntile1,
-- 对分区内的数据分成三组
ntile(3) over(partition by departmentid order by math) as ntile2
from student_scores;
结果
id studentid language math english classid departmentid ntile1 ntile2
1 111 68 69 90 class1 department1 1 1
9 124 76 70 76 class2 department1 1 1
6 121 96 74 79 class2 department1 1 1
3 113 90 74 75 class1 department1 1 2
8 123 70 78 61 class2 department1 1 2
2 112 73 80 96 class1 department1 2 2
7 122 89 86 85 class2 department1 2 3
5 115 99 93 89 class1 department1 2 3
4 114 89 94 93 class1 department1 2 3
18 223 79 74 96 class2 department2 1 1
15 216 85 74 93 class1 department2 1 1
17 222 80 78 96 class2 department2 1 1
19 224 75 80 78 class2 department2 1 1
14 215 84 82 73 class1 department2 1 2
11 212 76 83 75 class1 department2 1 2
20 225 82 85 63 class2 department2 2 2
10 211 89 93 60 class1 department2 2 2
12 213 71 94 90 class1 department2 2 3
13 214 94 94 66 class1 department2 2 3
16 221 77 99 61 class2 department2 2 3
结果解释:
第8行
ntile1:对分区的数据均匀分成2组后,当前行的组排名为2
ntile2:对分区的数据均匀分成3组后,当前行的组排名为3
5.percent_rank开窗函数
计算给定行的百分比排名。可以用来计算超过了百分之多少的人,不含本身;
计算公式:(当前行的rank值-1)/(分组内的总行数-1)
类似与cume_dist开窗函数,是统计小于当前分数的人数占总人数的比例;
-- percent_rank 开窗函数
select studentid,departmentid,classid,math,
row_number() over(partition by departmentid,classid order by math) as row_number,
percent_rank() over(partition by departmentid,classid order by math) as percent_rank
from student_scores;
结果
studentid departmentid classid math row_number percent_rank
111 department1 class1 69 1 0.0
113 department1 class1 74 2 0.25
112 department1 class1 80 3 0.5
115 department1 class1 93 4 0.75
114 department1 class1 94 5 1.0
124 department1 class2 70 1 0.0
121 department1 class2 74 2 0.3333333333333333
123 department1 class2 78 3 0.6666666666666666
122 department1 class2 86 4 1.0
216 department2 class1 74 1 0.0
215 department2 class1 82 2 0.2
212 department2 class1 83 3 0.4
211 department2 class1 93 4 0.6
213 department2 class1 94 5 0.8
214 department2 class1 94 6 0.8
223 department2 class2 74 1 0.0
222 department2 class2 78 2 0.25
224 department2 class2 80 3 0.5
225 department2 class2 85 4 0.75
221 department2 class2 99 5 1.0
结果解释:
studentid=115,percent_rank=(4-1)/(5-1)=0.75
studentid=123,percent_rank=(3-1)/(4-1)=0.6666666666666666
参考:https://blog.csdn.net/wangpei1949/article/details/81437574
以上是关于大数据之Hive:Hive 开窗函数的主要内容,如果未能解决你的问题,请参考以下文章