Hive及 hql優化個人心得

2021-10-08 11:26:02 字數 2616 閱讀 3781

hql優化篇:

*******優化的核心一 優先考慮全表掃瞄問題 where條件判斷等在tablescan階段就進行過濾

2 跨區間跑數

方案 :關聯時間維表設計

left join (select part_dt from dim.dim_period_d) 可以根據需求設計不同時間字段

主表時間分割槽小於時間維 做跨區間執行。

例子:left join (select distinct substr(period_date,1,10) period_date from

dim.dim_period_d ta where ta.period_date >= substr(cast(date_sub(』,dayofweek(』』)-2+if(dayofweek(』』)=1,7,0))

as string),1,10) and ta.period_date < 『』 )tc on 1=1

where part_dt<=period_date and

weekofyear(part_dt)=weekofyear(period_date) and

substr(part_dt,1,4)=substr(period_date,1,4) group by

yw,wr,period_date

******* 時間維的使用靈活常見

優化策略:

1 去除不必要的字段column

2 按需求取分割槽限制

3 提前清除資料,限制map資料大小,map端的combine建議常規開啟

4 如果多個union all ,因為有很多0插入,建議寫成多段insert into ,實測提高效率。優化效能。

5 null值處理 ,coalesce或nvl 處理。

******* 優化的核心二 提前過濾,減小主表資料,根據需要做hash,distinct處理,結合對mr的理解做優化

join使用:

map端join以大表驅動 (小表載入到記憶體 ,參考shuffle過程的記憶體緩衝區)

left join 小表在右,on 條件左表在前,right join 或inner join 小表在左 on 條件右表在前,left semi join 等同於in,但是實際使用中 semi join的剔除條件需要加到主表去限制,判斷是否有完全剔除(有坑)

hive中不讓使用not in:

常見方法

left join 或 not exists處理

例子 :

and not exists (select 1 from table_name1)

and not exists (select 1 from table_name2)

各位hive報錯,不能同時啟用2個not exists ,雖然not exists 效率會高於left join ,但還是忍痛割愛。

where限制資料為null:

常見方法

where a.id=case when b.id is null then concat(『hive』,rand() ) else b.id end;

資料傾斜 :

常見的資料傾斜有3種情況

group 分組,count(distinct ) ,join 所導致

常用解決方案

1負載均衡設定 hive.groupby.skewindata=true

2 如count(distinct)可以考慮用goup by sum()替代計算

3 可以考慮在對大資料量的字段如果為 null ,在字段後面拼接hash 或者 rand()去打散。

4 可以考慮將傾斜的資料單獨業務處理union all.

優化基本流程

一 效能評估和服務構成

二明確當前環境各個元件效能

三分析定位效能瓶頸

四優化效能瓶頸

五效能監控和告警

開發規範,設計規範,命名規範

原則上理解需求原則

把握全資料鏈路原則

檢查**簡潔原則

優化手段上

hql優化,配置引數,從需求和架構(**,模組,系統)

hql工具篇:

針對hql,首先考慮避免全表掃瞄,hive沒有索引掃瞄時是讀取到hdfs檔案中,所以主表分割槽表中分割槽字段放在前面,不要限制:

如: where substr(part_dt,1,7) = substr() 不建議

where part_dt>=concat(substr(start_date,1,7),』-01』) 正確

另外還有部分案例 :

題目一 計算當月最後一天的彙總資料

題目二 當月最後一天計算當月彙總,其它情況算近30天

每個月最後一天 :last_day(part_dt) as period_date

substr(cast(add(part_dt,1) as string),9,2)=『01』

當月最後一天計算當月彙總,其不是最後一天算近30天:

另外關聯時間維計算最後一天 period_date 跨區間分別計算時間 period_wid

part_dt>=(case when part_dt=period_date then concat(substr(period_date,1,7),』-01』)

when part_dt

******* 寫在最後,防止資料發散,計算嚴謹。

Hive個人心得筆記之基礎指令

desc 表 檢視表結構 沒有主鍵,可以重複提交 手動提交 效率過低,可以通過檔案形式傳輸 load data local inpath home software 1.txt into table stu 通重載入檔案資料到指定的表裡 但是,如果不指定分割格式,無法正常傳輸 作用 額外說明 sho...

typedef個人心得

一直以來對typedef都沒有乙個正確的理解,導致看到稍微複雜一點的typedef語句就很是迷惑。今天在查閱了一些資料並仔細思考了一番後,自我感覺有一些比較深刻的了解了。主要的幾點感悟 1 typedef和define typedef 在編譯時被解釋,define在預處理時被替換。define定義 ...

寒假集訓個人心得

寒假之初,進行了幾天的集訓,在每天的忙忙碌碌之中,也是有了一些的收穫 1.搜尋的近一步理解,深搜與廣搜只是基礎的兩種實現形式,關鍵還在於對於搜尋的優化,剪枝水平尤為重要。2.dp可看作一種優化到極致的搜尋,在判斷好空間與時間複雜度的情況下,可採取記憶化搜尋,許多能用dp來完成的題目,記憶化搜尋也是可...