一.表連線:
1.將大表放後頭
hive假定查詢中最後的乙個表是大表。它會將其它表快取起來,然後掃瞄最後那個表。
因此通常需要將小表放前面,或者標記哪張表是大表:/*streamtable(table_name) */。否則會引起磁碟和記憶體的大量消耗。
2. 使用相同的連線鍵
當對3個或者更多個表進行join連線時,如果每個on子句都使用相同的連線鍵的話,那麼只會產生乙個mapreduce job。
3. 盡量盡早地過濾資料
減少每個階段的資料量,對於分割槽表要加分割槽,同時只選擇需要使用到的字段。
4. 盡量原子化操作
盡量避免乙個sql包含複雜邏輯,可以使用中間表來完成複雜的邏輯
5.大大表關聯:
把空值的key變成乙個字串加上隨機數,把傾斜的資料分到不同的reduce上,由於null值關聯不上,處理後並不會影響最終結果。
二.用insert into替換union all
如果union all的部分個數大於2,或者每個union部分資料量大,應該拆成多個insert into 語句,實際測試過程中,執行時間能提公升50%
三.order by & sort by
order by : 對查詢結果進行全域性排序,消耗時間長。需要 set hive.mapred.mode=nostrict
sort by : 區域性排序,並非全域性有序,提高效率。
五. limit 語句快速出結果
一般情況下,limit語句還是需要執行整個查詢語句,然後再返回部分結果。
有乙個配置屬性可以開啟,避免這種情況---對資料來源進行抽樣
hive.limit.optimize.enable=true --- 開啟對資料來源進行取樣的功能
hive.limit.row.max.size --- 設定最小的取樣容量
hive.limit.optimize.limit.file --- 設定最大的取樣樣本數
缺點:有可能部分資料永遠不會被處理到
六. 並行執行
hive會將乙個查詢轉化為乙個或多個階段,包括:mapreduce階段、抽樣階段、合併階段、limit階段等。
預設情況下,一次只執行乙個階段。 不過,如果某些階段不是互相依賴,是可以並行執行的。
set hive.exec.parallel=true,可以開啟併發執行。
set hive.exec.parallel.thread.number=16; //同乙個sql允許最大並行度,預設為8。
會比較耗系統資源。
八.map join
set hive.auto.convert.join = true; # 預設為false
該引數為true時,hive自動對左邊的表統計量,如果是小表就加入記憶體,即對 小表使用map join
/*+streamtable(a)+*/ 指明哪張表是大表。對其它小表放入記憶體中。
/*+mapjoin(b)+*/ 指明小表,並且放入記憶體中
九.automatic merge:
hive.merge.mapfiles = true 是否合併map輸出檔案,預設為true
hive.merge.mapredfiles = false 是否合併reduce 輸出檔案 預設為false
hive.merge.size.per.task = 256*1000*1000 合併檔案的大小
十.並行:
set hive.exec.parallel=true設定為true。
要把那些沒有相互依賴之間的關係的一些節點就可以能夠盡可能的並行。
十一.嚴格模式
set hive.marped.mode=strict ------ 防止使用者執行那些可能意想不到的不好的影響的查詢
-- 分割槽表,必須選定分割槽範圍
-- 對於使用order by的查詢,要求必須使用limit語句。因為order by為了執行排序過程會將所有的結果資料分發到同乙個reducer中進行處理。
-- 限制笛卡爾積查詢:兩張表join時必須有on語句
Hive 筆記五 hive的優化
本地模式 嚴格模式 jvm重用 並行執行 推測還行 合併小檔案 fetch模式 1.列裁剪和分割槽裁剪 列裁剪是在查詢時只讀取需要的列 分割槽裁剪就是只讀取需要的分割槽。2.sort by代替 order by 3.group by 代替count distinct 1 common join 普通...
hive的效能優化
計算資料優化主要有兩種思路,一種是減少處理資料量 一種是解決資料傾斜。資料傾斜一般可以分為三種 join階段資料傾斜 reduce階段資料傾斜 主要有兩種方式 1.2 join階段資料傾斜 是最常見的資料傾斜,按照表的大小和join方式的不同分別有多種處理方式。1.2.1 mapjoin 作用 適用...
hive的優化方案
對資料進行分割槽,可以將資料以一種符合邏輯的方式進行組織 比如分層儲存 同時極大提高查詢效能。在建立表的時候,根據後續查詢需求 partitioed by 對資料進行合理的分割槽,下面我們根據 province 和 city 進行對資料進行分割槽分割槽 create table if not exi...