害,最近組裡有個妹子不是很懂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...