Hive 優化總結

2021-06-22 12:01:36 字數 1246 閱讀 4393

1. left semi join

let semi join 只是hive的一種join。

left semi-join是可以高效實現in/exists子查詢的語義。hive本身是不支援exist和in語句的,以下sql語義:

(1)select a.key, a.value from a where a.key in (select b.key from b);

未實現left semi-join之前,hive實現上述語義的語句是:

hive> select a.key from a  left outer join (select distinct key from b) t on a.key = t.key where t.key is not null;

total mapreduce jobs = 3

(2)可被替換為left semi-join如下:

hive> select a.key from  a  left semi join t on a.key = t.key;

total mapreduce jobs = 1

這一實現減少至少1次mapreuduce過程,注意left semi-join的join條件必須是等值,本例中減少了兩個。

map/reduce 實現:兩個表資料都流向reduce端之後,只要判斷某個join key的group(iterator)裡面是否帶有tag 為b表的記錄,如果有顯示exist。所以map/reduce 實現起來比較簡單。

2. 空值處理

如果兩個表join時,某個表的join key 上有大量空值,這樣會造成reduce skew

解決方法一,在join前先過濾掉

select a.key,b.key from a join b on (a.key = b.key and b.key is not null)

解決方法二,把空值變為隨機值

select

a.uid from a aleft

outer

join b b.uid =case

when a.uid is

null

or length(a.uid)=0

then concat('rd_sid',rand()) else a.uid end

;

hive優化要點總結

個人認為總體兩種思想 1 讓伺服器盡可能的多做事情,榨乾伺服器資源,以最高系統吞吐量為目標 再好的硬體沒有充分利用起來,都是白扯淡。比如 1 啟動一次job盡可能的多做事情,乙個job能完成的事情,不要兩個job來做 通常來說前面的任務啟動可以稍帶一起做的事情就一起做了,以便後續的多個任務重用,與此...

hive查詢優化總結

hive查詢優化總結 儲存,學習,分享 join查詢操作的基本原則 應該將條目少的表 子查詢放在 join 操作符的左邊。原因是在 join 操作的 reduce 階段,位於 join 操作符左邊的表的內容會被載入進記憶體,將條目少的表放在左邊,可以有效減少發生記憶體溢位錯誤的機率。join查詢操作...

hive優化方式總結

1.多表join優化 結構 select from jointables a,b,c with keys a.key,b.key,c.key where 關聯條件相同多表join會優化成乙個job 2.leftsemi join是可以高效實現in exists子查詢的語義 select a.key,...