版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/56488568
1. 常用分析函数
下表列出了一些分析函数以及描述信息:
分析函数 | 描述 |
---|---|
RANK | 返回数据项在分区中的排名。排名值序列可能会有间隔 |
DENSE_RANK | 返回数据项在分区中的排名。排名值序列是连续的,不会有间隔 |
PERCENT_RANK | 计算当前行的百分比排名 |
ROW_NUMBER | 确定分区中当前行的序号 |
CUME_DIST | 计算分区中当前行的相对排名 |
NTILE() | 将每个分区的行尽可能均匀地划分为指定数量的分组 |
2. 语法
window_function () OVER clause
3. 分析函数
3.1 RANK()
RANK函数会返回数据项在分区中的排名。OVER子句中的ORDER BY语句来确定根据哪个值进行排名。如果多行中的排序值相同,则会有相同的排名。如果有排名相同的情况下,则会在名次中留下空位(DENSE_RANK()不会出现这种情况,具体可以对比一下)。例如,如果两行排名为3,则下一个排名为5。
下面对用户每天浏览量进行一个排名。
select gid, dt, pv, rank() over (partition by gid order by pv desc) as pre_total_pv from tmp_pv order by gid, dt;
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-10 1 7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 6
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 5
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 4
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 1
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 7
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 5
Time taken: 24.065 seconds, Fetched: 14 row(s)
3.2 DENSE_RANK()
DENSE_RANK函数,同上面的RANK()函数一样,返回数据项在分区中的排名。OVER子句中的ORDER BY语句来确定根据哪个值进行排名。具有相等值的行,有相同的排名。不同于RANK()函数的地方在于如果两个或更多行具有相同的排名,在排名值的序列中没有间隙。例如,如果两行排名为3,则下一个排名为4,不同于RANK()函数返回5。
下面对用户每天浏览量进行一个排名:
hive> select gid, dt, pv, dense_rank() over (partition by gid order by pv desc) from tmp_pv order by gid, dt;
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-10 1 6
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 5
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 4
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 1
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 6
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 5
Time taken: 24.18 seconds, Fetched: 14 row(s)
3.3 PERCENT_RANK()
PERCENT_RANK函数使用以下公式计算当前行的百分比排名:
(x - 1)/(窗口分区中的行数 - 1)
其中x是当前行的排名
hive> select gid, dt, pv, percent_rank() over (partition by gid order by pv) from tmp_pv order by gid, dt;
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-10 1 0.0
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 0.8333333333333334
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 1.0
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 0.3333333333333333
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 0.16666666666666666
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 0.5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 0.5
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 0.16666666666666666
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 0.8333333333333334
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 0.5
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 1.0
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 0.0
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 0.6666666666666666
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 0.16666666666666666
Time taken: 25.236 seconds, Fetched: 14 row(s)
3.4 ROW_NUMBER()
ROW_NUMBER函数确定分区中当前行的序号。当前行的序号是由OVER子句中的ORDER BY表达式来确定的。
hive> select gid, dt, pv, row_number() over (partition by gid order by pv desc) from tmp_pv;
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 6
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-10 1 7
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 1
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 4
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 5
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 6
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 7
Time taken: 8.235 seconds, Fetched: 14 row(s)
3.5 CUME_DIST()
CUME_DIST函数计算分区中当前行的相对排名:
(前面的行数)/(分区中的总行数)
如果有相等值的行(取决于OVER子句中的order by):
(前面的行数+相等值行数)/(分区中的总行数)
hive> select gid, dt, pv, cume_dist() over (partition by gid order by pv) from tmp_pv;
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-10 1 0.14285714285714285
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 0.2857142857142857
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 0.42857142857142855
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 0.7142857142857143
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 0.7142857142857143
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 0.8571428571428571
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 1.0
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 0.14285714285714285
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 0.42857142857142855
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 0.42857142857142855
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 0.5714285714285714
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 0.7142857142857143
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 0.8571428571428571
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 1.0
Time taken: 10.416 seconds, Fetched: 14 row(s)
3.6 NTILE()
NTILE函数将每个分区的行尽可能均匀地划分为指定数量的分组。 例如,NTILE(4)表示划分为4个分组。NTILE函数分组取决于OVER子句中的ORDER BY子句。
hive> select gid, dt, pv, ntile(4) over (partition by gid order by pv) from tmp_pv;
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-10 1 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 4
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 1
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 1
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 4
Time taken: 10.363 seconds, Fetched: 14 row(s)