1 分析函數:用於等級、百分點、n分片等
Ntile 是Hive很強大的一個分析函數。
- 可以看成是:它把有序的數據集合 平均分配 到 指定的數量(num)個桶中, 將桶號分配給每一行。如果不能平均分配,則優先分配較小編號的桶,並且各個桶中能放的行數最多相差1。
- 語法是:
ntile (num) over ([partition_clause] order_by_clause) as your_bucket_num
- 然后可以根據桶號,選取前或后 n分之幾的數據。
例子:
給了用戶和每個用戶對應的消費信息表, 計算花費前50%的用戶的平均消費;
-- 把用戶和消費表,按消費下降順序平均分成2份 drop table if exists test_by_payment_ntile; create table test_by_payment_ntile as select nick, payment , NTILE(2) OVER(ORDER BY payment desc) AS rn from test_nick_payment; -- 分別對每一份計算平均值,就可以得到消費靠前50%和后50%的平均消費 select 'avg_payment' as inf, t1.avg_payment_up_50 as avg_payment_up_50, t2.avg_payment_down_50 as avg_payment_down_50 from (select avg(payment) as avg_payment_up_50 from test_by_payment_ntile where rn=1 )t1 join (select avg(payment) as avg_payment_down_50 from test_by_payment_ntile where rn=2 )t2 on (t1.dp_id=t2.dp_id);
Rank,Dense_Rank, Row_Number
SQL很熟悉的3個組內排序函數了。語法一樣:
R() over (partion by col1... order by col2... desc/asc)
select class1, score, rank() over(partition by class1 order by score desc) rk1, dense_rank() over(partition by class1 order by score desc) rk2, row_number() over(partition by class1 order by score desc) rk3 from zyy_test1;
如上圖所示,rank 會對相同數值,輸出相同的序號,而且下一個序號不間斷;
dense_rank 會對相同數值,輸出相同的序號,但下一個序號,間斷
row_number 會對所有數值輸出不同的序號,序號唯一連續;
2. 窗口函數 Lag, Lead, First_value,Last_value
Lag, Lead
LAG(col,n,DEFAULT) 用於統計窗口內往上第n行值
LEAD(col,n,DEFAULT) 用於統計窗口內往下第n行值, 與LAG相反
-- 組內排序后,向后或向前偏移
-- 如果省略掉第三個參數,默認為NULL,否則補上。
select dp_id, mt, payment, LAG(mt,2) over(partition by dp_id order by mt) mt_new from test2;
-- 組內排序后,向后或向前偏移
-- 如果省略掉第三個參數,默認為NULL,否則補上。
select dp_id, mt, payment, LEAD(mt,2,'1111-11') over(partition by dp_id order by mt) mt_new from test2;
FIRST_VALUE, LAST_VALUE
first_value: 取分組內排序后,截止到當前行,第一個值
last_value: 取分組內排序后,截止到當前行,最后一個值
-- FIRST_VALUE 獲得組內當前行往前的首個值 -- LAST_VALUE 獲得組內當前行往前的最后一個值 -- FIRST_VALUE(DESC) 獲得組內全局的最后一個值 select dp_id, mt, payment, FIRST_VALUE(payment) over(partition by dp_id order by mt) payment_g_first, LAST_VALUE(payment) over(partition by dp_id order by mt) payment_g_last, FIRST_VALUE(payment) over(partition by dp_id order by mt desc) payment_g_last_global from test2 ORDER BY dp_id,mt;