1、collect_set函式
需求:求使用者消費的 top 100,需要的資料格式是:id 消費金額 nickname
分析:消費 top 比較簡單 group by uuid order by allcnt 可以解決,但是使用者的nickname(暱稱)是有多個的,隨機取乙個就行,但是 hive 取的資料字段中必須在 group by **現,取nickname就有點麻煩了,這時候collect_set() 函式就派上用場了。
解決方案:
table:bank_core
uuid paymem nickname dt
10001 12.5 jack 2018-04-16 00:15:00
10001 15.5 jack_2 2018-04-16 15:00:00
10002 10.2 tom 2018-04-16 17:00:00
sql:select uuid, sum(paymem) allcnt, collect_set(nickname)[0] from bank_core group by uuid order by allcnt desc limit 100;
2、row_number() over ( partition by 欄位a order by 欄位b [desc])函式
row_number() over ( partition by 欄位a order by 欄位b ) 這個函式用於對 group by 分組裡面的資料進行排序的。
需求:求使用者消費的 top 100,需要的資料格式是:id 消費金額 nickname, 此處的nickname 需要是使用者最新的暱稱。
分析:上面用到的collect_set() 函式是隨機取乙個 nickname,此處就不太吻合需求了,row_number() over ... 就可以解決這個問題了,row_number() over (partition by uuid order by dt desc),指在分組中按照 uuid 分組,按照 dt 排序, 這裡得到的是 num
解決方案:
資料如上。
sql:select s.uuid, s.allcnt, s.nickname from
( select uuid, sum(paymem) allcnt, nickname,
row_number() over (partition by uuid order by dt desc)rank from bank_core group by uuid,nickname, dt) swhere s.rank <= 1
關於 row_number() over (partition by 欄位a order by 欄位b ) 這個函式解釋得可能很不清楚。。。
Hive執行流程分析
先看0.7.1的執行過程 hive select from table02 where id 500000 對於這樣的乙個查詢,hive從clidriver這個類的main函式開始 clidriver.main string args clisessionstate ss new clisessio...
Hive 執行流程簡述
hive 的架構 hive 的核心驅動 driver 1 直譯器 直譯器的作用是將 hivesql 語句轉換為抽象語法樹 ast 2 編譯器 編譯器是將語法樹編譯為邏輯執行計畫 3 優化器 優化器是將邏輯執行計畫優化為更優邏輯計畫 4 執行器 執行器是將邏輯計畫切成對應引擎的可執行物理計畫 執行流程...
Hive元件及Hive執行流程
元儲存 metastore 儲存 系統目錄以及關於表 列 分割槽等的元資料 的元件。驅動 driver 控制 hiveql 生命週期的元件,當 hiveql 查詢穿過 hive時。該驅動管理著會話控制代碼以及任何會話的統計。查詢編譯器 query compiler 是乙個元件,將hiveql編譯成有...