Hive中的全部Join

  1. 內鏈接:inner join

--join優化:在進行join的時候,大表放在最後面ide

--可是使用 /+streamtable(大表名稱)/ 來標記大表,那麼大表放在什麼位置都行了優化

select /+streamtable(s)/ s.ymd,d.dividendtable

from stocks s inner join dividends d on s.ymd=d.ymd and s.symbol=d.symbolstream

where s.symbol=’aapl’配置

  1. 外鏈接:left outer join,right outer join,full outer join

把外鏈接(outer join)中where語句中的過濾條件,放在on語句是無效的。不過對於內鏈接有效。select

  1. 笛卡爾積:join

join的時候不使用on,而使用where的。map

--笛卡爾積join很緩慢,能夠設置hive.mapred.mode=strict來阻止執行引用

hive.mapred.mode=stricttab

  1. 左半開鏈接:left semi-join(hive不支持右半開鏈接)

左半開鏈接(left semi-join)會返回左邊表的記錄,前提是其記錄對於右邊表知足on語句中的斷定條件。di

select和where語句中都不能引用右邊表的字段。

適用場景:

由於hive不支持in...exists結構,因此要使用左半開鏈接代替.

注意點:

semi-join比inner join更高效

hive不支持右半開鏈接.

  1. map端join:map-side join

map-side join:hive能夠在map端執行鏈接過程(對於在join時有一個是小表的狀況)

使用map-side join,須要配置下: (1)hive0.7版本以前,須要加/*+ mapjoin(表名) */

select /*+ mapjoin(d) */ s.ymd,d.dividend from stocks s join dividends d

on s.ymd=d.ymd and s.symbol=d.symbol

where s.symbol=’AAPL (2)hive0.7版本開始,設置hive.auto.convert.join=true

hive.auto.convert.join=true

hive.mapjoin.smalltable.filsize=25000000 --使用這個優化的小表的大小(單位:字節)--注意:右外鏈接和全外鏈接不支持這個優化

備註:

(1). hive的join語句,只支持等值鏈接。 (2). 注:pig提供的交叉生成功能支持「非等值鏈接」. (3). hive目前不支持在join 的on子句中使用or。

相關文章
相關標籤/搜索