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來完成的題目,記憶化搜尋也是可...