网站首页 > 技术文章 正文
1. 问题描述
原sql:
select a.user_id, a.其他字段, b.其他字段
flink sql on hive,使用了left join去关联字典表,由于字典表中某一个值对应的左边记录表中的数据条数非常非常多,是其他字典值的数十倍之多,因此在join时发生了数据倾斜,这一个字典值对应的所有记录都跑到了一个并行度中,如下图所示:
其他并行度接收的数据量远远小于第一个并行度。
2. 解决方案
2.1 字典表数据扩展
将字典表数据进行扩展。
比如字典表为用户信息,和记录表的关联字段为用户id,则可以在用户id后面添加从0~9的数字,将其扩展为原来的十倍,示例sql如下所示:
insert into temp.user_info_10select concat(user_id, '0') as user_id, 其他字段值保持不变insert into temp.user_info_10select concat(user_id, '1') as user_id, 其他字段值保持不变insert into temp.user_info_10select concat(user_id, '2') as user_id, 其他字段值保持不变
上面一个10个sql语句,在用于关联的字段“用户id”后面拼接0~9的数字,将原字典表数据扩展为原来的10倍。
2.2 left join
当用户日志表和用户字典表关联时,需要将用户日志表的“用户id”字段后面拼接上0~9的数字,两个目的:
- 和字典表进行关联,能够找到对应的值。由于两边都在字段值后面添加了指定范围内的数字,因此肯定可以关联上,而且结果和原sql一致。
- 将用户日志记录数据中的“用户id”打散到不同的并行度,解决数据倾斜问题。
示例SQL:
select a.user_id, a.其他字段, b.其他字段left join user_info_10 as bon concat(a.user_id, cast(cast(rand(10) * 10 as int) as int)) = b.user_id
运行过程图:
可以看到,和原sql相比,数据倾斜已经不是特别严重了。
3. 其他倾斜情况
如果记录表中的某个用户,在字典表中并不存在,但是这个用户的的日志非常多,造成了严重的数据倾斜,此时就不用扩展字典表了,直接将对该用户的id进行随机数拼接,然后打散该用户的记录,关联时使用该用户拼接之后的id进行关联即可。
由于该用户原id就无法关联到字典表数据,所以打散之后也关联不到字典表数据,对结果无影响。
示例sql如下:
select a.user_id, a.其他字段, b.其他字段 when user_id = '记录最多,但是字典表中没有的用户id' then concat(user_id, cast(cast(rand(10) * 10 as int) as string)) else user_id endon a.user_id_join = b.user_id
猜你喜欢
- 2025-02-03 彻底搞懂where,inner join,left join,right join,full join的区别
- 2025-02-03 FLINK-SQL之JOIN的6种方式(flink sql执行流程)
- 2025-02-03 详细介绍MySQL中的LEFT JOIN、INNER JOIN和RIGHT JOIN
- 2025-02-03 SQL关联各种JOIN傻傻分不清楚,读这一篇就够了
- 2025-02-03 2副图秒懂SQL中的join(sqljoin的用法)
- 2025-02-03 SQL JOIN 从入门到精通——看懂这张图,告别面试尴尬!
- 2025-02-03 浅析Sql中内连接、外连接、全连接、交叉连接的区别
- 2025-02-03 什么,LEFT JOIN 会变成 JOIN?(left join on in)
- 2025-02-03 left join中的on和where条件你真的理解了吗?
- 2025-02-03 初学者的一分钟SQL Join教程(sql技巧)
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 563℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 508℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 485℃启用MySQL查询缓存(mysql8.0查询缓存)
- 465℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 445℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 442℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)