應用場景
(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
上面的兩個是排序函式,如果只想給當前行編個號呢?
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
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
結果資料:
如果想把某個分組內分成比較均勻的幾份,可以使用 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
結果如下:
參考訂閱
hive分析函式
遇到以下問題如何解決?查詢客戶各個日期的歷史累積購買金額 查詢每個客戶第一次 首購 或前n次購買記錄 查詢每個客戶最後一次購買記錄 某活動推廣後,每天的累積資料 查詢客戶每天的歷史累積購買金額 hive 語法 select userid user id,pay datekey pay datekey...
Hive的分析函式
記錄下hive的常用函式 hive的常用函式和平常我們使用的關係型資料庫基本都差不多,這裡只是記錄一下,方便後面回顧。準備測試資料.hadoop hadoop apache hive 0.13.1 bin cat emp.txt 7369 smith clerk 7902 1980 12 17 80...
hive的分析函式
1 rollup group by 的增強函式 實現根據部門號 工作職位求工資總和,根據部門求工資總和,查所有人的工資總和 通過group by 語句的增加來實現 select deptno,job,sum sal from emp group by rollup deptno,job 語法 gro...