Hive工程實踐

2021-08-21 09:55:46 字數 3020 閱讀 2053

最近在參與某tob專案,資料需離線統計出並推送至線上業務庫,其中用hive做的離線分析。總結寫下常見問題及心得吧。

一.工程類技術範疇:資料統計工作大題劃分為四步:

指標統計、批量指令碼、資料格式、異常流程;

step2. 批量指令碼:將step1建立的各張表綜合成批量執行的perl指令碼;複雜度在於:若執行時間長,會影響業務方使用,可自行測試出大小適中的perl指令碼(把大的指令碼做垂直區分,如申請類乙個指令碼,提現類乙個指令碼;或者做水平區分,如vintage指標依賴中間許多邏輯,可以把部分邏輯單獨拆分為中間表,最終vintage指標再依賴該中間表);

step3.資料格式:新建一張總表,該錶儲存所有的指標值;並且將step2生成的表轉化成業務方期望的資料格式(可以把step2指標轉換為多個業務方期望格式,做指標復用)。示例如下:

step4.異常流程:包括批量指令碼父子任務執行順序異常,今日統計的資料異常時資料回滾或重新統計等,資料去重以及資料備份等;

二.hive類技術範疇

1. 常用優化

1.1 定理:如果只用rn=1,即只需最值,則沒必要用rownumber。查詢申請表裡授信金額最大的一筆訂單?

case1: select * from a where dt='2018-12-19' order by loan_amount desc limit 1;(map70s 、reduce400s)(常用但低效)

case2: select * from (select *,max(loan_amount )  la from a  where dt='2018-12-19') a where la=loan_amount ;(map70s 、reduce1300s )(常用但低效)

case3: select * from (select *, row_number() over(sort by loan_amount desc) rn from a where dt='2018-12-19) a where  rn=1;(map70s 、reduce9000s timeout)

case4: select * from (select *  from  a where dt='2018-12-19') a join (select max(loan_amount) la from a where dt=2018-12-19') b on a.loan_amount=la; (map70s、map70s、reduce2s )

1.2 定理: 替代distinct

1.3 各階段複雜度:  

指定為月末:

2.1 when split(statistics_date,'-')[1] in ('1','3','5','7','8','10','12') then concat(statistics_date,'-31')

when split(statistics_date,'-')[1] in ('4','6','9','11') then concat(statistics_date,'-30')

when cast(split(statistics_date,'-')[0] as int)%4=0 and split(statistics_date,'-')[1] in ('2') then concat(statistics_date,'-29')

when cast(split(statistics_date,'-')[0] as int)%4!=0 and  split(statistics_date,'-')[1] in ('2') then concat(statistics_date,'-28')  end as new_statistics_date

2.2 date_sub(concat(substr(concat(substr(created_date, 1, 7), '-01'), 1, 7), '-01'), 1)

3.常用函式

3.1 行轉列:collect_set/collect_list(得到的是array型別);clollect_ws可以合併collect_set(如collect_ws(',',collect_set()));

case1: 產品預設排序,把產品彙總到一行。

3.2 列轉行:lateral view explode/pos_explode   

case1: select v from (select split('1 2 3 4 5 6 7 8 9 0',' ') v1 ) t1 lateral view explode(v1) t2 as v;

case2: select date_sub(from_unixtime(unix_timestamp(),'yyyy-mm-dd'),t.pos + 1) as biz_date from (select  pose_explode(split(space(30),' ')));  如下圖,統計某行過去30天每天的申請提現指標。(若用group by的原因,則select的字段需做collect_set判斷;本語句select欄位多,繁瑣)

3.4 其他:instr; months_between; 

order by,sort by, distribute by, cluster by:參照 

演算法實踐 特徵工程

資料集是金融資料 非原始資料,已經處理過了 我們要做的是 貸款使用者是否會逾期。中 status 是結果標籤 0表示未逾期,1表示逾期。特徵選擇 分別用iv值和隨機森林進行特徵選擇。再用7個模型 邏輯回歸 svm 決策樹 隨機森林 gbdt xgboost和lightgbm 進行模型評估。iv的全稱...

提公升hive效率的最佳實踐

表相關 儲存格式 避免使用text,json,有可能的haul也應避免sequence檔案 理想的格式是rcfile row columnar file 壓縮 block compression 比 value compression更高效,最終結果及中間結果都應壓縮,set hive.exec.c...

大資料實踐HIVE詳解

一.hive的事務 1 什麼是事務 要知道hive的事務,首先要知道什麼是transaction 事務 事務就是一組單元化操作,這些操作要麼都執行,要麼都不執行,是乙個不可分割的工作單位。事務有四大特性 a c i d 原子性 一致性 隔離性 永續性 atomicity 不可再分割的工作單位,事務中...