關於hive的執行流程記錄

2021-12-30 12:23:22 字數 1317 閱讀 6684

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編譯成有...