hive的優化方案

2021-09-24 14:04:12 字數 1532 閱讀 4051

對資料進行分割槽,可以將資料以一種符合邏輯的方式進行組織(比如分層儲存),同時極大提高查詢效能。

在建立表的時候,根據後續查詢需求』partitioed by( )'對資料進行合理的分割槽,下面我們根據『province』和『city』進行對資料進行分割槽分割槽:

create table if not exists tbl_per_info (no int, name string, *** string, age int, salary flaot) partitioned by (province string, city string);
'province』和』city』已經在檔案目錄名稱中了,不需要再把這些值放在目錄下的檔案中,浪費空間。當我們需要查詢在山東德州的員工個人資訊時:

select * from tbl_per_info where province = '山東省' and city = '德州市'
這時查詢僅僅需要掃瞄山東省德州市這乙個目錄,其他省市的資料就都被忽略了。

hive 預設查詢中最後乙個表是最大的表。在對每行記錄進行連線操作時,會嘗試將其他表快取起來,然後掃瞄最後的表進行計算。

select s.no, s.name, q.data from infos a join datatime q on s.no = q.no
這裡datatime這張表應該比info大。

在hive裡提供了乙個「標記」機制來顯式地告之優化器哪張表是大表,,這是不必在意表的前後問題:

select /*+streamtable(q)*/ s.no, s.name, q.data from infos a join datatime q on s.no = q.no
set hive.auto.convert.join=true;

set jive.mapjoin.smalltable.filesize=fizesize;

通過第乙個屬性設定來啟用map_side join,第二個屬性可以配置優化的小表的大小filesize

當資料集非常小時,通過本地模式在單台機器上處理所有任務,可以面下縮短執行時間,可以通過設定以下引數臨時啟用本地模式

set hive.exec.mode.local.auto=true;
hive會將乙個查詢轉化成多個階段,包括mapreduce、limit、合併等,但一般一次只會執行乙個階段。當一些階段不是完全依賴的時候,其實是可以並行執行的,這樣job工作可以更快的完成。

set hive.exec.paralle=true;
通過設定下面的屬性,可以啟用嚴格模式,幫助我們避免執行一些不好的查詢,包括:

(1)對於分割槽表,where語句中沒有分割槽字段過濾條件來限制查詢範圍;

(2)使用order by,而使用limit;

(3)笛卡爾積查詢。

set hive.mapred.mode=strict;

hive優化方案

核心思想 把hive sql 當做mapreduce程式去優化 以下sql不會轉為mapreduce來執行 select僅查詢本表字段 where僅對本表字段做條件過濾 其實本質上還是轉化為mapreduce來執行的,只不過預設設定了抓取策略 抓取策略 set hive.fetch.task.con...

HIVE優化 解決方案

1.開啟並行引數 set hive.exec.parallel true set hive.exec.parallel.thread.number 16 同乙個sql允許最大並行度,預設為8 2.負載均衡引數 只針對groupby操作的傾斜 set hive.groupby.skewindata t...

Hive 筆記五 hive的優化

本地模式 嚴格模式 jvm重用 並行執行 推測還行 合併小檔案 fetch模式 1.列裁剪和分割槽裁剪 列裁剪是在查詢時只讀取需要的列 分割槽裁剪就是只讀取需要的分割槽。2.sort by代替 order by 3.group by 代替count distinct 1 common join 普通...