1. 程式人生 > >Hive 開窗函式

Hive 開窗函式

什麼時候用開窗函式?

開窗函式常結合聚合函式使用,一般來講聚合後的行數要少於聚合前的行數,但是有時我們既想顯示聚集前的資料,
又要顯示聚集後的資料,這時我們便引入了視窗函式。

視窗函式的語法

UDAF() over (PARTITION By col1,col2 order by col3 視窗子句(rows between .. and ..)) AS 列別名

注意:PARTITION By後可跟多個欄位,order By只跟一個欄位。

over()的作用

over()決定了聚合函式的聚合範圍,預設對整個視窗中的資料進行聚合,聚合函式對每一條資料呼叫一次。

例如:

select name, orderdate, cost, sum(cost) over()
from business; 

partition by 子句

使用Partiton by子句對資料進行分割槽,可以用paritition by對區內的進行聚合。

例如:

select name, orderdate, cost, sum(cost) over(partition by name)
from business;

order by 子句

  • 對分割槽中的資料進行排序。
  • 確定聚合哪些行(預設從起點到當前行的聚合)。

例如:

select name, orderdate, cost, sum(cost) over(partition by name order by orderdate)
from business;

視窗子句

  • CURRENT ROW  當前行
  • n PRECEDING  往前n行資料
  • n FOLLOWING  往後n行資料
  • UNBOUNDED PRECEDING  表示從前面的起點
  • UNBOUNDED FOLLOWING  表示到後面的終點

通過使用partition by子句將資料進行了分割槽。如果想要對視窗進行更細的動態劃分,
就要引入視窗子句。

例如:

select name, orderdate,cost, sum(cost) 
over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and CURRENT ROW)
from business;

注意

  • order by 必須跟在 partition by 後;
  • rows 必須跟在 Order by 後;
  • (partition by .. order by ..)  可替換為  (distribute by .. sort by ..)