1葱峡、窗口函數(shù)
常用到的Hive窗口函數(shù)具體有:row_number()砚哗、rank()砰奕、dense_rank() 這三個(gè)窗口函數(shù)蛛芥,具體區(qū)別主要有:
row_number:不管排名是否有相同的军援,都按照順序1仅淑,2胸哥,3…..n
rank:排名相同的名次一樣涯竟,同一排名有幾個(gè)空厌,后面排名就會(huì)跳過幾次
dense_rank:排名相同的名次一樣庐船,且后面名次不跳躍
1)row_number()
代碼如下所示:
SELECT user_id,
order_id,
row_number() OVER(PARTITION BY user_id order by order_id DESC) as rn
FROM access_cdm.dwd_trade_order_goods_dd_f
WHERE dt = '2021-08-25' AND user_id IN(7822416, 66440,10386724, 2613996)
LIMIT 100;
結(jié)果展示如下:
2)rank()
代碼如下所示:
SELECT user_id,
order_id,
rank() OVER(PARTITION BY user_id order by order_id DESC) as rn
FROM access_cdm.dwd_trade_order_goods_dd_f
WHERE dt = '2021-08-25' AND user_id IN(7822416, 66440,10386724, 2613996)
LIMIT 100;
查詢結(jié)果如下:
3)dense_rank()
代碼如下所示:
SELECT user_id,
order_id,
dense_rank() OVER(PARTITION BY user_id order by order_id DESC) as rn
FROM access_cdm.dwd_trade_order_goods_dd_f
WHERE dt = '2021-08-25' AND user_id IN(7822416, 66440,10386724, 2613996)
LIMIT 100;
查詢結(jié)果如下:
2醉鳖、排序函數(shù)
(1)order by
hive中的 order by 會(huì)對(duì)查詢結(jié)果集執(zhí)行一次全局排序,這也就是說所有的數(shù)據(jù)都通過一個(gè)reduce進(jìn)行處理的過程哮内,對(duì)于大數(shù)據(jù)集,這個(gè)過程將消耗很大的時(shí)間來執(zhí)行北发。
(2)sort by
hive中的 sort by 也就是執(zhí)行一個(gè)局部排序過程纹因。這可以保證每個(gè)reduce的輸出數(shù)據(jù)都是有序的(但并非全局有序)琳拨。這樣就可以提高后面進(jìn)行的全局排序的效率瞭恰。用戶可以指定任意期望進(jìn)行排序的字段狱庇,并可以在該字段后面加上asc關(guān)鍵字(默認(rèn))表示升序惊畏,desc關(guān)鍵字是降序排列密任。
在使用 sort by 之前,需要先設(shè)置 reduce 的數(shù)量 > 1浪讳,才會(huì)做局部排序缰盏,如果reduce數(shù)量是1,作用與 order by 一樣口猜,全局排序。
(3)distribute by
distribute by 控制 map 的輸出在 reducer 中是如何劃分的济炎,mapReduce job中傳輸?shù)乃袛?shù)據(jù)都是按照鍵-值對(duì)的方式進(jìn)行組織的川抡,因此hive在將用戶的查詢語句轉(zhuǎn)換成mapReduce job時(shí)冻辩,其必須在內(nèi)部使用這個(gè)功能拆祈。默認(rèn)情況下恨闪,MapReduce計(jì)算框架會(huì)依據(jù)map輸入的鍵計(jì)算相應(yīng)的哈希值放坏,然后按照得到的哈希值將鍵-值對(duì)均勻分發(fā)到多個(gè)reducer中去咙咽。
(4)cluster by
cluster by 除了 distribute by 的功能外淤年,還會(huì)對(duì)該字段進(jìn)行排序钧敞,所以 cluster by = distribute by + sort by麸粮。但是排序只能是倒敘排列溉苛,不能指定排序規(guī)則為ASC或者DESC弄诲。
3愚战、行列轉(zhuǎn)換函數(shù)
(1)lateral view explain
Lateral view 其實(shí)就是用來和像類似于explode這種UDTF函數(shù)聯(lián)用的齐遵。lateral view 會(huì)將UDTF生成的結(jié)果放到一個(gè)虛擬表中寂玲,然后這個(gè)虛擬表會(huì)和輸入行即每個(gè)game_id 進(jìn)行join 來達(dá)到連接UDTF外的select字段的目的梗摇。
lateral view explode 函數(shù)舉例如下:
SELECT game_id, user_id
FROM test_table AS t
lateral view explode(split(user_ids, ',')) sn_table AS user_id