hive窗口函數(shù)總結(jié)

一:前言

根據(jù)官網(wǎng)的介紹,hive推出的窗口函數(shù)功能是對hive sql的功能增強蒸苇,確實目前用于離線數(shù)據(jù)分析邏輯日趨復(fù)雜,很多場景都需要用到。以下就是對hive窗口函數(shù)的一個總結(jié)附上案例钧唐。

二:理解下什么是WINDOW子句(靈活控制窗口的子集)

PRECEDING:往前
FOLLOWING:往后
CURRENT ROW:當(dāng)前行
UNBOUNDED:起點(一般結(jié)合PRECEDING,F(xiàn)OLLOWING使用)
UNBOUNDED PRECEDING 表示該窗口最前面的行(起點)
UNBOUNDED FOLLOWING:表示該窗口最后面的行(終點)
比如說:
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示從起點到當(dāng)前行)
ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING(表示往前2行到往后1行)
ROWS BETWEEN 2 PRECEDING AND 1 CURRENT ROW(表示往前2行到當(dāng)前行)
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING(表示當(dāng)前行到終點)
官網(wǎng)有一段話列出了哪些窗口函數(shù)是不支持window子句的匠襟,如下圖所示:


image.png

三:準(zhǔn)備需要演示的數(shù)據(jù)

insert overwrite table dw_tmp.window_function_temp
select 
split(detail,',')[0] as uname
,split(detail,',')[1] as create_time
,split(detail,',')[2] as pv
from
(
    select
    concat('測試用戶,2019-10-02,7
    #測試用戶,2019-10-05,4
    #測試用戶,2019-10-07,5
    #測試用戶,2019-10-03,6
    #測試用戶,2019-10-04,3
    #測試用戶,2019-10-01,3
    #測試用戶,2019-10-06,4') as ct_str
) t
lateral view explode(split(ct_str,'#')) t2 as detail;
測試數(shù)據(jù).png

四:Windowing functions

1.LEAD(col,n,DEFAULT) 用于統(tǒng)計窗口內(nèi)往下第n行值第一個參數(shù)為列名钝侠,第二個參數(shù)為往下第n行(可選,默認為1酸舍,不可為負數(shù))帅韧,第三個參數(shù)為默認值(當(dāng)往下第n行為NULL時候,取默認值啃勉,如不指定忽舟,則為NULL)

2.LAG(col,n,DEFAULT) 用于統(tǒng)計窗口內(nèi)往上第n行值第一個參數(shù)為列名,第二個參數(shù)為往上第n行(可選淮阐,默認為1叮阅,不可為負數(shù)),第三個參數(shù)為默認值(當(dāng)往上第n行為NULL時候泣特,取默認值浩姥,如不指定,則為NULL)

select 
uname
,create_time
,pv
,lead(pv,1,-9999) over (partition by uname order by create_time) as lead_1_pv
,lag(pv,1,-9999) over (partition by uname order by create_time) as lag_1_pv
from dw_tmp.window_function_temp;
image.png

3.FIRST_VALUE取分組內(nèi)排序后状您,截止到當(dāng)前行及刻,第一個值,這最多需要兩個參數(shù)竞阐。第一個參數(shù)是您想要第一個值的列缴饭,第二個(可選)參數(shù)必須是false默認為布爾值的布爾值。如果設(shè)置為true骆莹,則跳過空值颗搂。

4.LAST_VALUE取分組內(nèi)排序后,截止到當(dāng)前行,最后一個值幕垦,這最多需要兩個參數(shù)丢氢。第一個參數(shù)是您想要第一個值的列傅联,第二個(可選)參數(shù)必須是false默認為布爾值的布爾值。如果設(shè)置為true疚察,則跳過空值蒸走。

select 
uname
,create_time
,pv
,first_value(pv) over (partition by uname order by create_time rows between unbounded preceding and current row) as first_value_pv
,last_value(pv) over (partition by uname order by create_time rows between unbounded preceding and current row) as last_value_pv
from dw_tmp.window_function_temp;
image.png

讓我們加上window子句來觀察一下變化,雖然FIRST_VALUE和LAST_VALUE不常于與window子句結(jié)合使用貌嫡。

select 
uname
,create_time
,pv
,first_value(pv) over (partition by uname order by create_time) as first_value_pv
,first_value(pv) over (partition by uname order by create_time rows between unbounded preceding and current row) as window_first_value_pv
,last_value(pv) over (partition by uname order by create_time) as last_value_pv
,last_value(pv) over (partition by uname order by create_time rows between unbounded preceding and current row) as window_last_value_pv
from dw_tmp.window_function_temp;
image.png

五:aggregates functions

1.COUNT
2.SUM
3.MIN
4.MAX
5.AVG
目前支持這五種帶有聚合意義的窗口函數(shù)比驻,以常用SUM舉例。

select 
uname
,create_time
,pv
,SUM(pv) over (partition by uname order by create_time) as sum_pv_1 --默認情況
,SUM(pv) over (partition by uname order by create_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as sum_pv_2 --表示從起點到當(dāng)前行
,SUM(pv) over (partition by uname) as sum_pv_3 --表示窗口內(nèi)所有行
,SUM(pv) over (partition by uname order by create_time ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as sum_pv_4 --表示起點到終點
,SUM(pv) over (partition by uname order by create_time ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING) as sum_pv_5 --表示前2行到后面1行
from dw_tmp.window_function_temp;
image.png

從結(jié)果當(dāng)中其實可以得到結(jié)論岛抄,默認情況就是從起點到當(dāng)前行别惦,不帶order by語句其實就是表示窗口內(nèi)全部行都參與聚合處理,這里其實還有其他用法夫椭,讀者可以自行嘗試一下掸掸。

六:Analytics functions

1.ROW_NUMBER
從1開始,按照順序蹭秋,生成分組內(nèi)記錄的序列,row_number()的值不會存在重復(fù),當(dāng)排序的值相同時,按照表中記錄的順序進行排列;通常用于獲取分組內(nèi)排序第一的記錄;獲取一個session中的第一條refer等扰付。
2.RANK
生成數(shù)據(jù)項在分組中的排名,排名相等會在名次中留下空位仁讨。
3.DENSE_RANK
生成數(shù)據(jù)項在分組中的排名羽莺,排名相等會在名次中不會留下空位。
4.CUME_DIST
CUME_DIST 小于等于當(dāng)前值的行數(shù)/分組內(nèi)總行數(shù)
5.PERCENT_RANK
PERCENT_RANK 分組內(nèi)當(dāng)前行的RANK值-1/分組內(nèi)總行數(shù)-1
6.NTILE
NTILE(n) 用于將分組數(shù)據(jù)按照順序切分成n片陪竿,返回當(dāng)前切片值禽翼,如果切片不均勻,默認增加第一個切片的分布族跛。NTILE不支持ROWS BETWEEN
以上是帶有分析功能的窗口函數(shù)闰挡,使用的頻率沒有上面兩類高,但是也是需要掌握的礁哄。

我們先對1-3三種分析窗口函數(shù)進行演示

select 
uname
,create_time
,pv
,ROW_NUMBER() over (partition by uname order by pv) as row_number_pv_1
,RANK() over (partition by uname order by pv) as row_number_pv_2
,DENSE_RANK() over (partition by uname order by pv) as row_number_pv_3
from dw_tmp.window_function_temp;
image.png

第4-5種:

select 
uname
,create_time
,pv
,CUME_DIST() over (partition by uname order by pv) as CUME_DIST_pv_
,PERCENT_RANK() over (partition by uname order by pv) as PERCENT_RANK_pv_
from dw_tmp.window_function_temp;
image.png

第六種:NTILE

select 
uname
,create_time
,pv
,NTILE(2) over (partition by uname order by pv) as NTILE_pv_1
,NTILE(3) over (partition by uname order by pv) as NTILE_pv_2
,NTILE(4) over (partition by uname order by pv) as NTILE_pv_3
from dw_tmp.window_function_temp;
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末长酗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桐绒,更是在濱河造成了極大的恐慌夺脾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茉继,死亡現(xiàn)場離奇詭異咧叭,居然都是意外死亡,警方通過查閱死者的電腦和手機烁竭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門菲茬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事婉弹〔腔辏” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵镀赌,是天一觀的道長氯哮。 經(jīng)常有香客問我,道長商佛,這世上最難降的妖魔是什么喉钢? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮威彰,結(jié)果婚禮上出牧,老公的妹妹穿的比我還像新娘穴肘。我一直安慰自己歇盼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布评抚。 她就那樣靜靜地躺著豹缀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慨代。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音缘挑,去河邊找鬼觅捆。 笑死,一個胖子當(dāng)著我的面吹牛想暗,可吹牛的內(nèi)容都是我干的妇汗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼说莫,長吁一口氣:“原來是場噩夢啊……” “哼杨箭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起储狭,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤互婿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辽狈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慈参,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年刮萌,在試婚紗的時候發(fā)現(xiàn)自己被綠了驮配。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖僧凤,靈堂內(nèi)的尸體忽然破棺而出畜侦,到底是詐尸還是另有隱情,我是刑警寧澤躯保,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布旋膳,位于F島的核電站,受9級特大地震影響途事,放射性物質(zhì)發(fā)生泄漏验懊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一尸变、第九天 我趴在偏房一處隱蔽的房頂上張望义图。 院中可真熱鬧,春花似錦召烂、人聲如沸碱工。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怕篷。三九已至,卻和暖如春酗昼,著一層夾襖步出監(jiān)牢的瞬間廊谓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工麻削, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒸痹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓呛哟,卻偏偏與公主長得像叠荠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子竖共,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容