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

        歡迎訪問 生活随笔!

        生活随笔

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

        编程问答

        hive案例

        發布時間:2023/12/9 编程问答 30 豆豆
        生活随笔 收集整理的這篇文章主要介紹了 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案例的全部內容,希望文章能夠幫你解決所遇到的問題。

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