join原理
join的優化
官網位址
hive支援傳統資料庫沒有的:
select u.name, o.orderid from
order o join
user u on o.uid = u.uid;
map join
在map
階段完成,沒有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...