hive常用窗口函數

1 hive窗口函數

在平時的開發中常用那些hive函數??

1、字符串操作函數?split、concat、ifnull、cast
2、聚合函數 : hive適用於分析,所以常用。
3、時間函數 : 數倉的特徵隨時間變化而變化,所以時間也特別多

哪窗口函數到底是什麼鬼??
hive中窗口函數是聚合函數的增強實現,是針對分組後,還需要對組內的每行數據返回一個對應的統計值。而這個聚合函數很難做到,聚合函數是一旦聚合就只能一個組返回一個值。

1.1 窗口函數列舉

sum(col) over() :  分組對col累計求和,over() 中的語法如下
count(col) over() : 分組對col累計,over() 中的語法如下
min(col) over() : 分組對col求最小
max(col) over() : 分組求col的最大值
avg(col) over() : 分組求col列的平均值
first_value(col) over() : 某分區排序後的第一個col值
last_value(col) over() : 某分區排序後的最後一個col值
lag(col,n,DEFAULT) : 統計往前n行的col值,n可選,默認爲1,DEFAULT當往上第n行爲NULL時候,取默認值,如不指定,則爲NULL
lead(col,n,DEFAULT) : 統計往後n行的col值,n可選,默認爲1,DEFAULT當往下第n行爲NULL時候,取默認值,如不指定,則爲NULL
ntile(n) : 用於將分組數據按照順序切分成n片,返回當前切片值。注意:n必須爲int類型。

排名函數:
row_number() over() : 排名函數,不會重複,適合於生成主鍵或者不併列排名
rank() over() :  排名函數,有並列名次,名次不連續。如:1,1,3
dense_rank() over() : 排名函數,有並列名次,名次連續。如:1,1,2

重點語法:
主要是 over(分組 排序 窗口) 中的order by後的語法。物理和邏輯窗口具體語法如下:

1.1.1 、物理窗口(真實往上下移動多少行rows between)

CURRENT ROW | UNBOUNDED PRECEDING | [num] PRECEDING AND UNBOUNDED FOLLOWING | [num] FOLLOWING| CURRENT ROW

如: over(partition by col order by rows between 1 preceding and 1 fllowing)

在這裏插入圖片描述

1.1.2、 邏輯窗口(滿足條件上下多少行)

range between [num] PRECEDING AND [num] FOLLOWING

如: over(partition by col order by range between 5 preceding and 5 fllowing)

在這裏插入圖片描述

注意:窗口函數一般不和group by搭配使用。

應用:
某天某產品的累計銷售額。

物理窗口:

求累計即可(累計退款金額、累計交易額、累計訂單數量)

邏輯窗口:

範圍累計環比情況、某值上下加減。

1.1.2 編寫sql實現每個用戶截止到每月爲止的最大單月訪問次數和累計到該月的總訪問次數

數據:
userid,month,visits
A,2015‐01,5
A,2015‐01,15
B,2015‐01,5
A,2015‐01,8
B,2015‐01,25
A,2015‐01,5
A,2015‐02,4
A,2015‐02,6
B,2015‐02,10
B,2015‐02,5
A,2015‐03,16
A,2015‐03,22
B,2015‐03,23
B,2015‐03,10
B,2015‐03,1

每個用戶截止到每月爲止的最大單月訪問次數和累計到該月的總訪問次數,結果數據格式如下:

在這裏插入圖片描述

1.1.3 窗口函數案例:

create table visits(
userid string,
month string,
visits int
)
row format delimited fields terminated by ','
;

load data local inpath '/home/visits' into table visits;


select
t.userid,
t.month,
max(visits) over(distribute by t.userid sort by t.month) max_visits,
sum(visits) over(distribute by t.userid sort by t.month) total_visits,
t.visits
from (select
vs.userid,
vs.month,
sum(visits) visits
from visits vs
group by vs.userid,vs.month) t
;


結果:
OK
A       2015‐01 33      33      33
A       2015‐02 33      43      10
A       2015‐03 38      81      38
B       2015‐01 30      30      30
B       2015‐02 30      45      15
B       2015‐03 34      79      34


性能分析:
1、月份轉換成成時間戳更好
2、子查詢不會限制性能,相反更好。

1.2 窗口函數和聚合函數區別

返回值區別:
聚合函數:1個分組對應一個返回值。
窗口函數:1個分組中的每行數據,對應一個返回值。

場景區別:
聚合函數:用於分組統計。
窗口函數:用於組內統計,多用於組內排名、累計統計、前後範圍統計。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章