日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hive案例

發布時間:2023/12/9 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hive案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據傾斜:

操作
? Join on a.id=b.id
? Group by
? Count Distinct count(groupby)
? 原因
? key分布不均導致的
? 人為的建表疏忽
? 業務數據特點
? 癥狀
? 任務進度長時間維持在99%(或100%),查看任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。
? 查看未完成的子任務,可以看到本地讀寫數據量積累非常大,通常超過10GB可以認定為發生數據傾斜。
? 傾斜度
? 平均記錄數超過50w且最大記錄數是超過平均記錄數的4倍。Null 50w 10w
? 最長時長比平均時長超過4分鐘,且最大時長超過平均時長的2倍。
? 萬能方法
? hive.groupby.skewindata=true

??原因
? Hive在進行join時,按照join的key進行分發,而在join左邊的表的數據會首先讀入內存,如果左邊表的key相對分
散,讀入內存的數據會比較小,join任務執行會比較快;而如果左邊的表key比較集中,而這張表的數據量很大,
那么數據傾斜就會比較嚴重,而如果這張表是小表,則還是應該把這張表放在join左邊。
? 思路
? 將key相對分散,并且數據量小的表放在join的左邊,這樣可以有效減少內存溢出錯誤發生的幾率
? 使用map join讓小的維度表先進內存。
? 方法
? Small_table join big_table

?原因
? 日志中有一部分的userid是空或者是0的情況,導致在用user_id進行hash分桶的時候,會將日志中userid為0或者
空的數據分到一起,導致了過大的斜率。
? 思路
? 把空值的key變成一個字符串加上隨機數,把傾斜的數據分到不同的reduce上,由于null值關聯不上,處理后并不
影響最終結果。
?
? 方法 -0 2 -1 2 -2 3 -0 -1 -2 -
? on case when (x.uid = '-' or x.uid = '0‘ or x.uid is null) then concat(‘-',rand()) else x.uid end =f.user_id;

案例
? Select * from dw_log t join dw_user t1 on t.user_id=t1.user_id
? 現象:兩個表都上千萬,跑起來很懸 1,2,3,4,5,2,3,4 2,3,4
? 思路
? 當天登陸的用戶其實很少
? 方法
? Select/*+MAPJOIN(t12)*/ *
? from dw_log t11
? join (
? select/*+MAPJOIN(t)*/ t1.*
? from (
? select distinct user_id from dw_log --group by user_id
? ) t
? join dw_user t1
? on t.user_id=t1.user_id
? ) t12
? on t11.user_id=t12.user_id

?

原因
? 做count distinct時,該字段存在大量值為NULL或空的記錄。
? 思路
? count distinct時,將值為空的情況單獨處理,如果是計算count distinct,可以不用處理,直接過濾,在最后結
果中加1。
? 如果還有其他計算,需要進行group by,可以先將值為空的記錄單獨處理,再和其他計算結果進行union
? 方法
? select cast(count(distinct user_id)+1 as bigint) as user_cnt
? from tab_a
? where user_id is not null and user_id <> ''

?

案例
? Select day,count(distinct session_id),count(distinct user_id) from log a group by day
? 問題
? 同一個reduce上進行distinct操作時壓力很大
? 方法
select day,
count(case when type='session' then 1 else null end) as session_cnt,
count(case when type='user' then 1 else null end) as user_cnt
from (
select day,session_id,type
from (
select day,session_id,'session' as type
from log
union all
elect day user_id,'user' as type
from log
) group by day,session_id,type
) t1 group by day;

轉載于:https://www.cnblogs.com/taozizainali/p/9010629.html

總結

以上是生活随笔為你收集整理的hive案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。