hive 針對不同的查詢進行了優化,優化可以通過配置進行控制,本文將介紹部分優化的策略以及優化控制選項。
列裁剪(column pruning)
在讀資料的時候,只讀取查詢中需要用到的列,而忽略其他列。例如,對於查詢:
select a,b from t where e < 10;其中,t 包含 5 個列 (a,b,c,d,e),列 c,d 將會被忽略,只會讀取a, b, e 列
這個選項預設為真:hive.optimize.cp = true
分割槽裁剪(partition pruning)
在查詢的過程中減少不必要的分割槽。例如,對於下列查詢:
select * from (select c1, count(1)會在子查詢中就考慮 subq.prtn = 100 條件,從而減少讀入的分割槽數目。from t group by c1) subq
where subq.prtn = 100;
select * from t1 join
(select * from t2) subq on (t1.c1=subq.c2)
where subq.prtn = 100;
此選項預設為真:hive.optimize.pruner=true
join
在使用寫有 join 操作的查詢語句時有一條原則:應該將條目少的表/子查詢放在 join 操作符的左邊。原因是在 join 操作的 reduce 階段,位於 join 操作符左邊的表的內容會被載入進記憶體,將條目少的表放在左邊,可以有效減少發生 oom 錯誤的機率。
對於一條語句中有多個 join 的情況,如果 join 的條件相同,比如查詢:
insert overwrite table pv_users如果 join 的條件不相同,比如:select pv.pageid, u.age from page_view p
join user u on (pv.userid = u.userid)
join newuser x on (u.userid = x.userid);
insert overwrite table pv_usersmap-reduce 的任務數目和 join 操作的數目是對應的,上述查詢和以下查詢是等價的:select pv.pageid, u.age from page_view p
join user u on (pv.userid = u.userid)
join newuser x on (u.age = x.age);
insert overwrite table tmptablemap joinselect * from page_view p join user u
on (pv.userid = u.userid);
insert overwrite table pv_users
select x.pageid, x.age from tmptable x
join newuser y on (x.age = y.age);
join 操作在 map 階段完成,不再需要reduce,前提條件是需要的資料在 map 的過程中可以訪問到。比如查詢:
insert overwrite table pv_users可以在 map 階段完成 join,如圖所示:select /*+ mapjoin(pv) */ pv.pageid, u.age
from page_view pv
join user u on (pv.userid = u.userid);
group by
有資料傾斜的時候進行負載均衡
合併小檔案
檔案數目過多,會給 hdfs 帶來壓力,並且會影響處理效率,可以通過合併 map 和 reduce 的結果檔案來消除這樣的影響:
Hive 筆記五 hive的優化
本地模式 嚴格模式 jvm重用 並行執行 推測還行 合併小檔案 fetch模式 1.列裁剪和分割槽裁剪 列裁剪是在查詢時只讀取需要的列 分割槽裁剪就是只讀取需要的分割槽。2.sort by代替 order by 3.group by 代替count distinct 1 common join 普通...
hive 幾種hive優化方法
1.通過explain或者explain extended來檢視執行計畫。explain select from u3 執行結果 stage dependencies stage 0 is a root stage stage plans stage stage 0 fetch operator l...
Hive 優化總結
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....