hive rand函式 Hive實踐(高階篇)

2021-10-17 09:48:00 字數 3933 閱讀 3576

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 視窗分割槽...