Hive 窗口函數、分析函數


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;

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM