1.1、hive sql執行原理
簡單來說hive就是乙個查詢引擎,通過語法分析、語法解析、語法優化等一系列操作將sql轉化為mapreduce作業,mr作業一般會有以下幾個過程:
1.2、hive sql優化總結
常用sql優化手段,分幾個方面:
1.2.1 業務場景優化
1.2.2 語句本身優化
。優先過濾後再進行join操作,減少參與join的資料量
。union all代替join並行執行
。多表join時,盡量用相同key
。空值、無意義值過濾或者用隨機數打散避免傾斜
1.2.3 引數配置優化
1.3、hive sql優化示例
1.3.1引數設定優化
1.3.2 邏輯優化
1) 按需取資料,指定獲取的列、指定取資料的分割槽
--按需取資料,指定獲取的列、指定取資料的分割槽select ptdate, pay_type --獲取需要的字段,不需要不from tmp.dualwhere ptdate = '2020-09-21' --指定查詢資料的分割槽,一般是日期 and type = '***' --過濾需要的資料
2)cube 以及 distinct的優化
--優化前2-3小時--優化後45min左右select id , nvl(type, "合計") type , nvl(plat, "合計")plat , nvl(is_new, "合計")is_new , nvl(flag, "合計") flag , nvl(name, "合計")name , scene , count(user_id) exposure_product_uv , sum(exposure_product_pv) exposure_product_pv , sum(unique_product_exposure_pv) unique_product_exposure_pvfrom(select id , nvl(type, "合計") type , nvl(plat, "合計")plat , nvl(is_new, "合計")is_new , nvl(flag, "合計")flag , nvl(name, "合計")name , scene , user_id , sum(pv) exposure_product_pv , count(1) unique_product_exposure_pvfrom ( select id , nvl(type, "合計") type , nvl(plat, "合計")plat , nvl(is_new, "合計")is_new , nvl(flag, "合計")flag , nvl(name, "合計")name , scene , user_id , request_id , count(1) pv from tmp_exp_log where event = 'exposure_product' group by id , flag , name , is_new , plat , scene , type , user_id , request_id grouping sets( (id, plat, is_new, flag, name, scene, user_id, request_id) , (id, plat, is_new, scene, user_id, request_id) , (id, plat, scene, user_id, request_id) , (id, is_new, scene, user_id, request_id) , (id, name, scene, user_id, request_id) , (id, flag, scene, user_id, request_id) , (id, scene, user_id, request_id) , (id, plat, is_new, flag, name, scene, type, user_id, request_id) , (id, plat, is_new, scene, type, user_id, request_id) , (id, plat, scene, type, user_id, request_id) , (id, is_new, scene, type, user_id, request_id) , (id, name, scene, type, user_id, request_id) , (id, flag, scene, type, user_id, request_id) , (id, scene, type, user_id, request_id) ) )bgroup by id , flag , name , is_new , plat , scene , type , user_id) agroup by id , flag , name , is_new , plat , scene , type;
3)關聯欄位加隨機數,避免特殊值導致的笛卡爾積
--優化前1個多小時跑不完--優化後20min出結果select l.*, ......from tmp.dual1 lleft join tmp.dual2 u on (l.id = u.id and u.date = '2020-11-01')left join tmp.dual3 p on (if(l.pcode='-',rand(10),l.pcode) = p.pcode)left join tmp.dual4 w on (if(l.wcode='-',rand(10),l.wcode) = w.wcode)left tmp.dual5 el on (if(l.eid='-',rand(10),l.eid) = el.eid)where l.date = '2020-11-01'
4)join的子查詢維度一致可以改為union all+group by 減少關聯,並行執行
select date, sum(amt) as amt, sum(uv) as uv from ( select f.date, sum(f.amt) as amt, 0 as uv from tmp.dual1 f where 1 = 1 and f.date = '2020-10-11' group by f.date union all select f.date, 0 as amt, count(distinct f.user_id) as uv from tmp.dual2 f where 1 = 1 and f.date = '2020-10-11' group by f.date ) uniontable group by date
總結:hive sql的優化就是通過各種方式避免資料傾斜、資料冗餘、job或io過多,高效利用集群的併發特性。 HQL實現Hive的WordCount例項
hive create database wordcount oktime taken 2.313 seconds hive show databases ok default wordcount time taken 0.926 seconds,fetched 2 row s 官方的tutoria...
hive 解密 Hive 常用函式
2.concat str1,sep,str2,sep,str3,和 concat ws sep,str1,str2,str3,字串連線函式,需要是 string型字段。如果4個字段,想得到如下結果,看下兩個函式的區別 eg 1 select concat 江蘇省 南京市 玄武區 徐莊軟體園 2 se...
分析函式hive計算均值 Hive 分析函式
應用場景 1 用於分割槽排序 2 top n 3 層次查詢 常用分析函式 分析函式 描述 rank 返回資料項在分割槽中的排名。排名值序列可能會有間隔 dense rank 返回資料項在分割槽中的排名。排名值序列是連續的,沒有間隔 percent rank 計算當前行的百分比排名 x 1 視窗分割槽...