Hive查詢優化

2021-10-20 13:07:37 字數 2889 閱讀 5333

害,最近組裡有個妹子不是很懂sql,一查就等好長時間,看的我十分揪心,算了,寫幾個常見的hive查詢優化叭。

-- 1. 條目少的表或者子查詢放在join左邊,因為join左邊會讀入記憶體

select a.val ,b.val

from a --條目少

join b

on a.key =b.key

-- 2. join 操作的時候應當將過濾條件放在on後面,因為where會在join後執行

select a.val, b.val

from a

left join b

on a.key = b.key

where a.ds = '2021-02-07'

--等價於

select a.val,b.val

from a

left join b

on a.key = b.key and a.ds = '2021-02-07'

-- 3. join前過濾掉不相關的資料

select x.val,y.val

from (

select a.key,a.val

from a

where a.ds = '2021-02-07'

) as x

left join(

select b.key,b.val

from b

where b.ds = '2021-02-07'

)on x.key=y.key

-- 4. 假設不需要b表內容,優化left join,替換成left semi join

select a.key

from a

left join b

on a.key = b.key

where b.key1 is null --這裡的key1並不存在於a中

--等價於

select a.key

from a

left semi join b

on a.key = b.key --b表中的內容不會被查詢到

--等價於

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

-- 5. with as 的使用,優化子查詢過程,control1為全域性公共條件,control2,3為細分條件,最後再進行篩選。

with control_all as (

select a.val,b.val,c.val

from a

left join b

on a.key = b.key

left join c

on a.key =c.key

),control2 as (

...),control3 as (

...)select control2.val,control3.val

from control2

left join control3

where control2.key = control3.key

-- 6. 少用select * 和order by,可以到程式中排序,速度較快

-- 7. 使用union all,會將mr操作優化為乙個job,適用於兩表多次join union語句見

select *

from a

join (

select b.key as id from b

union all

select b.other key as id from b

) as b

on a.key = b.key

-- 8. 除非有count distinct,盡量子查詢內不要有group by,可以統一提取或者建立臨時表

select * from (

select * from a

union all

select b.val,count(b.val2) from b group by b.val

) as t

group by b.val

-- 等價於

insert t select b.val,b.val2 from b group by b.val;

select * from (

...)group by b.val

-- 9. 資料傾斜的優化 資料傾斜本質上由shuffle造成的,具體可見

-- 一般我直接使用

hive.groupby.skewindata = true

-- 10. 避免使用distinct,容易產生資料傾斜,最好使用groupby

select distinct a.key from a

--等價於

select key from a group by a.key

-- 11. 在查詢的過程中減少不必要的分割槽,即盡量指定分割槽,大多數資料使用ds分割槽

select * from a

where a.ds = '2021-02-07'

-- 12. 學會使用視窗函式

select * from

(select *, row_number() over (partition by sessionid,

order by timestamp desc) as rank

from clicks) a

where a.rank=1;

-- 13. 多表join使用key相同,這樣會變成乙個job

select a.val,b.val

from a

left join b

on a.key = b.key

left join c

on a.key = c.key

Hive查詢優化

1.先過濾,再查詢,因為每次生成中間表都會儲存到linux磁碟上 記住 不是hdfs 2.注意資料傾斜 傾斜的原因是reduce端資料的大量富集,可適度增加reduce 會著開啟 reduce自己判斷 某一比較大 自己再分開點.也就是合理設定 reduce數量 hive.exec.reducers....

hive查詢優化總結

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

hive查詢與優化

今早的過濾資料,盡可能的減少資料在每個階段的輸入和輸出,使用分割槽表時,要使用分割槽條件進行過濾 可以使用中間表來完成一些複雜的操作 join操作時,將小表放在join的左邊 union all的個數大於2,可以考慮使用inset into來優化 根據資料的本身特點,在使用join 和group b...