Spark Join大小表
创始人
2024-05-30 13:24:16
0

Spark Join大小表

  • 无法广播
  • 过滤后大
  • 小表数据分布均匀

大小表 : 大小表尺寸相差 3 倍以上

  • Join 优先考虑 BHJ
  • 小表的数据量 > 广播阈值时,优先考虑 SHJ

无法广播

大表 100GB、小表 10GB,都远超广播变量阈值

  • 当小表的尺寸 > 8GB时,创建广播变量,会中断任务执行,没有用 BHJ

以同维度组合统计日志中的访问量 :

  • 小表大表都大,无法 BHJ ,只能选择 SMJ
//左连接查询语句
select t1.gender, t1.age, t1.city, t1.platform, t1.site, t1.hour,coalesce(t2.payload, t1.payload)
from t1 left join t2 on t1.gender = t2.gender and t1.age = t2.age and t1.city = t2.city and t1.platform = t2.platform and t1.site = t2.site and t1.hour = t2.hour;

背景:两张表的 Schema 完全一致 ,基于 Join Keys 生成 Hash Key:

  • 把所有 Join Keys 拼接在一起,把 性别-小时 拼接成字符串
  • 用哈希算法 (MD5/SHA256 )对字符串做哈希,得出的哈希值 : Hash Key

在这里插入图片描述

内表就能进行广播变量时,把 SMJ 转为 BHJ

-- 调整后的左连接查询语句
select t1.gender, t1.age, t1.city, t1.platform, t1.site, t1.hour, coalesce(t2.payload, t1.payload)
from t1 left join t2 on t1.hash_key = t2. hash_key;

HashKey 是 Join Keys 哈希值。哈希运算,就要考虑哈希冲突

  • 解决方法:二次哈希:用两种哈希算法来生成 Hash Key 数据列

在这里插入图片描述

过滤后大

统计所有头部用户贡献的营业额,并按营业额倒序排序

  • 两张表都 > 广播阈值时,默认选择 SMJ
-- 查询语句,维表带过滤条件
select (orders.price * order.quantity) as revenue, users.name
from orders join users on orders.userId = users.id
where users.type = 'Head User'
group by users.name
order by revenue desc

维表带过滤条件 ,利用 AQE 在运行时动态地调整 Join ,把 SMJ 转为 BHJ ( spark.sql.adaptive.enabled 打开)

  • 注意:根据过滤后的维表的大小,调整广播阈值 spark.sql.autoBroadcastJoinThreshold ,AQE 才能 SMJ 转为 BHJ

用动态 Join , 中途会引发 Shuffle 的数据分发

  • 解决办法:DPP,减少事实表的扫描量,提升性能

用 DPP 的条件:

  • DPP 仅支持等值 Joins,不支持大于或小于这种不等值关联
  • 维表过滤后的数据集,要小于广播阈值,配置项:spark.sql.autoBroadcastJoinThreshold
  • 事实表必须是分区表,且分区字段 (可多个) 必须包含 Join Key

将 orders 做成分区表

  • 创建新的订单表 orders_new,并指定 userId 为分区键
  • 把原订单表 orders 的数据,灌进到 orders_new
//查询语句
select (orders_new.price * orders_new.quantity) as revenue, users.name
from orders_new join users on orders_new.userId = users.id
where users.type = 'Head User'
group by users.name
order by revenue desc

利用 DPP,在做数仓规划时,要结合常用查询与典型场景,提前设计好表结构,如: Schema、分区键、存储格式

小表数据分布均匀

当不满足 BHJ 时,会先选 SMJ 。但 Join 的两张表尺寸相差小,数据分布均匀时,SHJ 比 SMJ 更高效

统计所有用户贡献的营业额 :

-- 查询语句
select (orders.price * order.quantity) as revenue, 
users.name
from orders join users on orders.userId = users.id
group by users.name
order by revenue desc

用 Join Hints 选择 SHJ

-- Join hints 后的查询语句
select /*+ shuffle_hash(orders) */ (orders.price * order.quantity) as revenue,
from orders join users on orders.userId = users.id
group by users.name
order by revenue desc

SHJ 要成功完成计算、不抛 OOM 异常,需要保证小表的每个数据分片能放进内存

相关内容

热门资讯

一粥一饭当思来之不易初中作文... 一粥一饭当思来之不易初中作文 篇一粮食是人类赖以生存的基本生活资源,而一粥一饭则是构成粮食的最基本单...
我的愿望小学生作文500字(... 篇一:我的愿望我的愿望小学生作文500字 篇一我是一个小学生,生活在一个美丽的世界里。我有很多愿望,...
秋天的作文600字初中(精简... 秋天的作文600字初中 篇一秋天的美丽秋天是一年四季中最美丽的季节之一。当秋天来临,大自然开始变得五...
努力的作文素材(优质5篇) 努力的作文素材 篇一第一篇内容在我们的生活中,努力是一种非常重要的品质。努力可以帮助我们实现目标,克...
印象武隆初一作文【优秀5篇】 印象武隆初一作文 篇一初一暑假期间,我有幸和家人一起来到了美丽的武隆。这个小县城位于重庆,以其壮丽的...
七年级新生第一次作文800字... 篇一:我的初中生活七年级新生第一次作文800字 篇一初中生活即将开始,我感到既兴奋又紧张。我将开始进...
初一优秀作文一切都不会过去(... 初一优秀作文一切都不会过去 篇一一切都不会过去时间总是在不停地流逝,无论是快乐还是痛苦,都会成为过去...
借物喻理初中作文(经典6篇) 借物喻理初中作文 篇一《蚂蚁与草hopper的故事》在一个美丽的小村庄里,住着一只懒散的草hoppe...
我的家初一作文800字【经典... 我的家初一作文800字 篇一我们家是一个温馨而幸福的小家庭。爸爸是一个高大而慈祥的人,他是家里的顶梁...
照亮作文600字【优选5篇】 照亮作文600字 篇一照亮作文现代社会,写作已经成为了我们生活中不可或缺的一部分。无论是在学校还是在...
办好G20做好东道主初一作文... 办好G20做好东道主初一作文 篇一G20峰会是全球最重要的经济论坛之一,举办这一峰会对于中国来说是一...
团结的力量初一作文(经典5篇... 团结的力量初一作文 篇一团结的力量团结的力量是一种强大的力量,它能够将不同的个体聚集在一起,从而共同...
难忘那慈爱的眼神初中作文【精... 难忘那慈爱的眼神初中作文 篇一初中时,我曾经遇到过一位让我难以忘怀的老师,她独特的慈爱眼神给我留下了...
感恩母亲初中作文600字(经... 篇一:感恩母亲的教导母亲,是我生命中最重要的人。她是我生活的向导,她是我成长的引路人。在我初中的时候...
初一那一次真难忘500字作文... 初一那一次真难忘500字作文 篇一初一那一天,我怀着激动而紧张的心情来到了新学校。这是我人生中的一个...
我喜欢的格言 我喜欢的一则格言  我最喜欢的一句名言是:最大的幸福是在于我们的缺点得到纠正和我们的错误得到补救。这...
月亮初一500字作文(优质6... 月亮初一500字作文 篇一月亮初一,是指每个月的初一日晚上,当月亮初升时的美丽景象。在这个特殊的时刻...
乐在其中初中作文【经典6篇】 乐在其中初中作文 篇一我最喜欢的运动——篮球篮球是一项非常受欢迎的运动,也是我最喜欢的运动之一。每当...
初中我的奶奶作文(精选6篇) 初中我的奶奶作文 篇一我亲爱的奶奶奶奶是我最亲近的人,她矮矮胖胖的身材让人忍不住想拥抱她。她总是笑容...
七秒钟的记忆初中作文【优质3... 七秒钟的记忆初中作文 篇一七秒钟的记忆我曾经读过一本书,书名叫做《七秒钟的记忆》。这本书给了我很大的...