flink sql left join数据倾斜问题解决

本文介绍了如何处理Flink SQL在执行leftjoin操作时因字典表数据分布不均导致的数据倾斜问题。通过扩展字典表数据并在join时对用户ID进行随机数拼接,有效分散了数据并行度,从而缓解了倾斜。对于不存在于字典表中的用户ID,也可以通过类似方法打散其记录,确保关联操作的均衡。
摘要由CSDN通过智能技术生成

1. 问题描述

原sql:

select a.user_id, a.其他字段, b.其他字段
from temp.user_log as a
left join user_info as b
on a.user_id = b.user_id

flink sql on hive,使用了left join去关联字典表,由于字典表中某一个值对应的左边记录表中的数据条数非常非常多,是其他字典值的数十倍之多,因此在join时发生了数据倾斜,这一个字典值对应的所有记录都跑到了一个并行度中,如下图所示:

其他并行度接收的数据量远远小于第一个并行度。

2. 解决步骤

2.1 字典表数据扩展

将字典表数据进行扩展。

比如字典表为用户信息,和记录表的关联字段为用户id,则可以在用户id后面添加从0~9的数字,将其扩展为原来的十倍,示例sql如下所示:

insert into temp.user_info_10
select concat(user_id, '0') as user_id, 其他字段值保持不变
from temp.user_info
;
insert into temp.user_info_10
select concat(user_id, '1') as user_id, 其他字段值保持不变
from temp.user_info
;
insert into temp.user_info_10
select concat(user_id, '2') as user_id, 其他字段值保持不变
from temp.user_info
;
...

上面一共10个sql语句,在用于关联的字段“用户id”后面拼接0~9的数字,将原字典表数据扩展为原来的10倍。

2.2 left join

当用户日志表和用户字典表关联时,需要将用户日志表的“用户id”字段后面拼接上0~9的数字,两个目的:

  1. 和字典表进行关联,能够找到对应的值。由于两边都在字段值后面添加了指定范围内的数字,因此肯定可以关联上,而且结果和原sql一致。
  2. 将用户日志记录数据中的“用户id”打散到不同的并行度,解决数据倾斜问题。

示例SQL:

select a.user_id, a.其他字段, b.其他字段
from temp.user_log as a
left join user_info_10 as b
on concat(a.user_id, cast(rand() * 10 as int) = b.user_id

运行过程图:

可以看到,和原sql相比,数据倾斜已经不是特别严重了。

3. 其他倾斜情况

如果记录表中的某个用户,在字典表中并不存在,但是这个用户的的日志非常多,造成了严重的数据倾斜,此时就不用扩展字典表了,直接将对该用户的id进行随机数拼接,然后打散该用户的记录,关联时使用该用户拼接之后的id进行关联即可。

由于该用户原id就无法关联到字典表数据,所以打散之后也关联不到字典表数据,对结果无影响。

示例sql如下:

select a.user_id, a.其他字段, b.其他字段
from
    (
    select 
        user_id,
        case
            when user_id = '记录最多,但是字典表中没有的用户id' then concat(user_id, cast(cast(rand(10) * 10 as int) as string))
            else user_id end
        as user_id_join,
        其他字段
    from temp.user_log 
    ) as a
left join user_info as b
on a.user_id_join = b.user_id
;

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

第一片心意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值