Hive 優化 筆記5

2021-08-06 06:42:07 字數 2023 閱讀 1009

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)

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;

會在子查詢中就考慮 subq.prtn = 100 條件,從而減少讀入的分割槽數目。

此選項預設為真:hive.optimize.pruner=true

join

在使用寫有 join 操作的查詢語句時有一條原則:應該將條目少的表/子查詢放在 join 操作符的左邊。原因是在 join 操作的 reduce 階段,位於 join 操作符左邊的表的內容會被載入進記憶體,將條目少的表放在左邊,可以有效減少發生 oom 錯誤的機率。

對於一條語句中有多個 join 的情況,如果 join 的條件相同,比如查詢:

insert overwrite table pv_users

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);

如果 join 的條件不相同,比如:

insert overwrite table pv_users

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);

map-reduce 的任務數目和 join 操作的數目是對應的,上述查詢和以下查詢是等價的:

insert overwrite table tmptable

select * 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);

map join

join 操作在 map 階段完成,不再需要reduce,前提條件是需要的資料在 map 的過程中可以訪問到。比如查詢:

insert overwrite table pv_users

select /*+ mapjoin(pv) */ pv.pageid, u.age

from page_view pv

join user u on (pv.userid = u.userid);

可以在 map 階段完成 join,如圖所示:

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....