大数据之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 开窗函数的主要内容,如果未能解决你的问题,请参考以下文章

大数据之Hive:Hive 开窗函数

大数据之hive:开窗实战

大数据之-HIVE入门(二十)

大数据(3g)HIVE开窗函数应用场景(不定更)

Hive之窗口函数

大数据技术之Hive函数压缩和存储