本文介绍: 常见的方式:hive里最常用的方式生成唯一id,就是直接使用 row_number() 来进行,这个对于小数据量是ok的,但是当数据量大的时候会导致,数据倾斜,因为最后生成全局唯一id的时候,这个任务是放在一个reduce里进行的,数据量过大会有很大的瓶颈。优化的方式:主体的思想就是先分再合,参考下一个思路:这个思路是借鉴了一篇文章的思路:附上链接:bitmap用户分群方法在贝壳DMP的实践和应用_架构_侯学博_InfoQ精选文章我是只想用sql来做具体的实现,如何实现最好
常见的方式:
hive里最常用的方式生成唯一id,就是直接使用 row_number() 来进行,这个对于小数据量是ok的,但是当数据量大的时候会导致,数据倾斜,因为最后生成全局唯一id的时候,这个任务是放在一个reduce里进行的,数据量过大会有很大的瓶颈。
优化的方式:
主体的思想就是先分再合,参考下一个思路:
这个思路是借鉴了一篇文章的思路:附上链接:bitmap用户分群方法在贝壳DMP的实践和应用_架构_侯学博_InfoQ精选文章
1:将数据打散,分为N份
2:在这N份里,先分别给一个行号使用row_number()
3: 统计出来每份里有多少条数据
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;
原文地址:https://blog.csdn.net/weixin_36630761/article/details/134687875
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_9549.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。