hive 9 hive高階查詢之join

2021-10-07 13:28:34 字數 1417 閱讀 4249

join原理

join的優化

官網位址

hive支援傳統資料庫沒有的:

select u.name, o.orderid from

order o join

user u on o.uid = u.uid;

map joinmap階段完成,沒有shuffle和reduce階段。

mapjoin簡單來說就是:當連線兩個表乙個是較小的表,乙個是大表時。把較小的表放到記憶體中去,然後再對比較大的表進行map操作。每當掃瞄乙個大表中的資料時,就去小表中查詢是否有符合條件的資料,繼而進行連線。所有資料掃瞄完成後,直接輸出,不經過shuffle和reduce,同時因為使用了記憶體進行join,所有提高了效率。

首先是task a,它是乙個local task(在客戶端本地執行的task),負責掃瞄小表b的資料,將其轉換成乙個hashtable的資料結構,並寫入本地的檔案中,之後將該檔案載入到distributecache中。

接下來是task b,該任務是乙個沒有reduce的mr,啟動maptasks掃瞄大表a,在map階段,根據a的每一條記錄去和distributecache中b表對應的hashtable關聯,並直接輸出結果。

由於mapjoin沒有reduce,所以由map直接輸出結果檔案,有多少個map task,就有多少個結果檔案。

關聯鍵存在大量空值

where優化

sql執行時,join在where之前執行。因此如果想再join前進行過濾,顯示條件應該在join語句中,否則會做笛卡爾積

# 當該左外連線在a中發現key而在b中沒有發現key時,b中的列將為null,

# 包括分割槽列ds 後邊的where就沒有用了。

select a.val, b.val from a left

outer

join b

on(a.

key=b.

key)

where a.ds=

'2009-07-07'

and b.ds=

'2009-07-07'

;# 下面的語句將會提前根據條件過濾:

select a.val, b.val from a left

outer

join b

on(a.

key=b.

keyand b.ds=

'2009-07-07'

and a.ds=

'2009-07-07'

);

在已知某個key引起的資料傾斜時,對key進行拆分

官網位址

Hive高階查詢

select基礎 cte和巢狀查詢 3 高階語句 4 關聯查詢 mapjoin 1 load移動資料 2 insert表插入資料 使用insert語句將資料插入表 分割槽 insert 支援overwrite覆蓋和into追加 hive支援從同乙個表進行多次插入 insert into中table關...

Hive總結(十二)Hive查詢高階

通過hive提供的order by子句可以讓最終的輸出結果整體有序。但是因為hive是基於hadoop之上的,要生成這種整體有序的結果,就必須強迫hadoop只利用乙個reduce來完成處理。這種方式的 就是回降低效率。如果你不需要最終結果整體有序,你就可以使用sort by子句來進行排序。這種排序...

Hive高階查詢練習02

一 求每一年最大氣溫的那一天 溫度 1 說明 資料格式 2010012325 2014010114 2014010216 2014010317 2014010410 2014010506 2012010609 2012010732 2012010812 2012010919 2012011023 2...