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