hive join語句優化

2021-10-07 16:24:02 字數 846 閱讀 8195

有兩種方法可以啟用它。

1.是通過使用乙個注釋,

/ * + mapjoin(小表)* /,此c樣式注釋應放在select之後,它指示hive將別名(小表)載入到記憶體中。

select /*+ mapjoin(c) */ * from orders o join cities c on (o.city_id = c.id);
2.另一種開啟mapjoins的方法是讓hive自動執行。

只需在配置中將hive.auto.convert.join設定為true,hive就會對小於hive.mapjoin.smalltable.filesize(預設值為25mb)的任何表自動使用mapjoins。

mapjoins有乙個侷限性,即不能在同一表或別名的查詢中的不同列上進行聯接。

這是有道理的,因為大概hive在聯接中使用的列上使用了乙個hashmap鍵控,而這樣的hashmap對於在不同鍵上的join將毫無用處)。

可以通過限定where條件子查詢的子表,進行連線。

select /*+ mapjoin(sr) */ count(*)

from

( select *

from a

where source='c'

) gjoin

( select * from b

where source='c'

) sr

on (g.key = sr.key);

參考:

Hive Join方式與優化

hive支援的join方式有inner join和outer join,這和標準sql一致。除此之外,還支援一種特殊的join left semi join。left semi join即左半開連線,hive使用左半開連線實現 in exists 語法,在0.13版本推出in not in exis...

hive join優化點 持續更新

select m.from 大表1 m where m.id in select l.id from 小表2 l 效能非常差,使用left semi join代替select m.from 大表1 m left semi join 小表2 l on m.id l.id limit 10 但是 小表2...

Hive JOIN實現過程

準備資料 語句 select a.uid,a.name,b.age from logs a join users b on a.uid b.uid 我們希望的結果是把users表join進來獲取age欄位。hive select from logs oka蘋果5 a橙子3 b燒雞1 hive sel...