Hive 分析函數

本文首發於:大數據每日嗶嗶-Hive 分析函數

應用場景

(1)用於分區排序
(2)Top N
(3)層次查詢

常用分析函數

分析函數 描述
RANK 返回數據項在分區中的排名。排名值序列可能會有間隔
DENSE_RANK 返回數據項在分區中的排名。排名值序列是連續的,沒有間隔
PERCENT_RANK 計算當前行的百分比排名:(x - 1)/(窗口分區中的行數 - 1)
CUME_DIST 統計小於或等於當前值的行數佔總行數的比例:
x/分區行數
ROW_NUMBER 確認分區中當前行的序號
NTILE 將每個分區的行儘可能均勻地劃分爲指定數量的分組

語法:analytics_functions over() clause

準備了一個表,用於測試:

create table test.gid_pv(
 gid string comment '商品ID'
,dt string comment '日期'
,pv string comment '訪問次數'
) comment '商品訪問次數'
row format delimited
 fields terminated by ','
 collection items terminated by '\n'
stored as textfile
;

數據如下:

0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2020-01-10	1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2020-01-11	5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2020-01-12	7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2020-01-13	3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2020-01-14	2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2020-01-15	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2020-01-16	4
993BD7AD-3B62-BA0C-15AE-A14B85921889	2020-01-10	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2020-01-11	9
993BD7AD-3B62-BA0C-15AE-A14B85921889	2020-01-12	3
993BD7AD-3B62-BA0C-15AE-A14B85921889	2020-01-13	1
993BD7AD-3B62-BA0C-15AE-A14B85921889	2020-01-14	1
993BD7AD-3B62-BA0C-15AE-A14B85921889	2020-01-15	8
993BD7AD-3B62-BA0C-15AE-A14B85921889	2020-01-16	2

RANK函數會返回數據項在分區中的排名。OVER子句中的ORDER BY語句來確定根據哪個值進行排名。如果多行中的排序值相同,則會有相同的排名。如果有排名相同的情況下,則會在名次中留下空位。例如,如果兩行排名爲3,則下一個排名爲5。DENSE_RANK()不會出現這種情況,具體可以對比一下

select 
 gid
,dt
,pv
,rank() over (partition by gid order by pv desc) as pre_total_pv_rank
,dense_rank() over (partition by gid order by pv desc) as pre_total_pv_dense_rank 
from test.gid_pv 
order by 
 gid
,dt
;

image.png
image.png

上面的兩個是排序函數,如果只想給當前行編個號呢?

select 
 gid
,dt
,pv
,row_number() over (partition by gid order by pv) as pre_total_pv_row_number
from test.gid_pv 
order by 
 gid
,dt
;

image.png

CUME_DIST函數計算分區中當前行的相對排名:(前面的行數)/(分區中的總行數)
如果有相等值的行(取決於OVER子句中的order by):(前面的行數+相等值行數)/(分區中的總行數)

一般默認升序即可。

select 
 gid
,dt
,pv
-- (前面的行數)/(分區中的總行數),如果有相等值的行:(前面的行數+相等值行數)/(分區中的總行數)
,cume_dist() over (partition by gid order by pv) as pre_total_pv_cume_dist
from test.gid_pv 
order by 
 gid
,dt
;

結果數據:
image.png
image.png
如果想把某個分組內分成比較均勻的幾份,可以使用 ntile 函數:(比如想要統計消費金額前 50%的用戶的平均消費,可以按照消費金額排序,分成 2 份。)

select 
 gid
,dt
,pv
,ntile(4) over (partition by gid order by pv) as pre_total_pv_ntile
from test.gid_pv 
order by 
 gid
,dt
;

結果如下:
image.png
image.png

參考

https://blog.csdn.net/SunnyYoona/article/details/56488568
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics
https://jordenbruce.com/2019/12/09/hql-function-analytic/

訂閱

掃碼_搜索聯合傳播樣式-標準色版.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章