本文介绍: 常见的方式hive里最常用的方式生成唯一id,就是直接使用 row_number() 来进行,这个对于小数据量是ok的,但是当数据量大的时候会导致,数据倾斜,因为最后生成全局唯一id的时候,这个任务是放在一个reduce里进行的,数据量过大会有很大的瓶颈。优化方式:主体的思想就是先分再合,参考下一个思路:这个思路是借鉴了一篇文章的思路:附上链接bitmap用户分群方法在贝壳DMP的实践和应用_架构_侯学博_InfoQ精选文章我是只想用sql来做具体的实现如何实现最好

常见的方式

 hive里最常用的方式生成唯一id,就是直接使用 row_number() 来进行,这个对于小数据量是ok的,但是当数据量大的时候会导致,数据倾斜,因为最后生成全局唯一id的时候,这个任务是放在一个reduce里进行的,数据量过大会有很大的瓶颈。

优化方式

主体的思想就是先分再合,参考下一个思路:

这个思路是借鉴了一篇文章的思路:附上链接bitmap用户分群方法在贝壳DMP的实践和应用_架构_侯学博_InfoQ精选文章

我是只想用sql来做具体的实现,如何实现最好呢?

1:将数据打散,分为N份

2:在这N份里,先分别给一个行号使用row_number()

3: 统计出来每份里有多少条数

4: 计算出来每个分片里最大的行号是多少

5:然后将对应的每份里的数据条数+每份里的2步骤生成的行号

with temp01 as (
    select
        iccid,
        imsi,
        cast(rand() * 200 as bigint) num
    from
        原始表
    where
        date_id = '20231123';

)
select
    a.iccid,
    a.imsi,
    a.num as a_num,
    a.rn,
    b.num as b_num,
    b.cnt,
    b.amt,
    nvl(b.amt, 0) + rn as final_num
from
    (
        select
            iccid,
            imsi,
            num,
            ROW_NUMBER() OVER(PARTITION BY num) AS rn
        from
            temp01
    ) a
    left outer JOIN (
        select
            num,
            cnt,
            sum(cnt) over(
                order by
                    num
            ) amt
        from
            (
                select
                    num,
                    count(*) cnt
                from
                    temp01
                group by
                    num
            ) a
    ) b on a.num -1 = b.num;

配上完整的sql实现逻辑

 

原文地址:https://blog.csdn.net/weixin_36630761/article/details/134687875

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_9549.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注