hive join優化點 持續更新

2021-10-05 17:47:17 字數 1504 閱讀 8951

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 中的字段不能在where字句和select字句**現,比如:下面的兩個語句都會報錯:

select m.*, l.* from 大表1 m left semi join 小表2 l on m.id= l.id limit 10

;select m.* from 大表1 m left semi join 小表2 l on m.id= l.id where l.url like "%234%" limit 10

;

將資料量比較小的表,直接快取在記憶體,然後在map段完成join,效能提高不少

第一種方式,比較老的方式

select /*+ mapjoin(小表2)*/  m.*, l.* from 大表1 m join 小表2l on m.id= l.id limit 10

;

第二種方式,設定引數的方式:

set hive.auto.convert.join=

true

;select m.*, l.* from 大表1 m join 小表2 l on m.id= l.id limit 10

;

當兩張join的表都很大的時候使用這種方式(兩個bucket表)

兩張表對join欄位進行分bucket,且buckets的數量是倍數關係,然後使用bucket map join效能會很高

set hive.optimize.bucketmapjoin=

true

;select /*+ mapjoin(小表2)*/ m.*, l.* from 大表1 m join 小表2 l on m.id = l.id limit 10

;

當資料在bucket中是按照順序排列的,且兩張表的相同的字段的buckets的數量是一樣多的,則可以使用這種方式的join

set hive.input.format = org.apache.hadoop.hive.ql.io.bucketizedhiveinputformat;

set hive.optimize.bucketmapjoin =

true

;set hive.optimize.bucketmapjoin.sortedmerge =

true

;select /*+ mapjoin(小表2)*/ m.*, l.* from 大表1 m join 小表2 l on m.id= l.id limit 10

;

hive join語句優化

有兩種方法可以啟用它。1.是通過使用乙個注釋,mapjoin 小表 此c樣式注釋應放在select之後,它指示hive將別名 小表 載入到記憶體中。select mapjoin c from orders o join cities c on o.city id c.id 2.另一種開啟mapjoi...

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...

HBase使用優化(持續更新)

這裡只準備介紹我實際操作中遇到的一些使用優化或解決辦法,想大致了解hbase優化的同學可以參考我之前轉載的幾篇博文。1.第乙個我想說的是hbase的寫操作,api層面上的優化 比如批量寫,關閉wal之類的 我這裡就不囉嗦了,我想要說的是rowkey的設計,這個問題一般會跟io的大小息息相關,io越大...