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 异常,需要保证小表的每个数据分片能放进内存

相关内容

热门资讯

我们的节日端午主持稿 我们的节日端午主持稿(通用12篇)  在当下社会,很多地方都会使用到主持稿,主持稿具有语言过度自然、...
婚礼主持词开场白   第一篇:  尊敬的各位来宾,  很高兴接受一对新人的委托,主持今天这场爱情的盛典,我是主持人张 ...
幸福额度简介及台词 幸福额度简介及台词  《幸福额度》简介  《幸福额度》由陈正道执导,林志玲、陈坤、廖凡主演的爱情电影...
舞蹈大赛主持词 舞蹈大赛主持词集合七篇  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。在人们积极参与各...
团代会闭幕词 团代会闭幕词精选3篇  今天,CN人才网小编给大家分享的是团代会闭幕词精选3篇,希望对大家有帮助。 ...
职工代表大会主持词 职工代表大会主持词  ×××××第二十一届四次职工代表大会  开幕式主持词  各位代表:  根据大会...
婚礼主持词(精选10篇) 婚礼主持词(精选10篇)  主持词的格式及写法  1.标题  一般情况下,只需写明“主持词”即可,也...
农村婚庆司仪主持词 农村婚庆司仪主持词  主持词可以采用和历史文化有关的表述方法去写作以提升活动的文化内涵。在现今人们越...
泰坦尼克号英文台词 泰坦尼克号英文台词  导语:泰坦尼克号以1912年泰坦尼克号邮轮在其处女启航时触礁冰山而沉没的事件为...
宋小宝的小品烤串台词 宋小宝的小品烤串台词  宋小宝是我国著名的喜剧演员,下面一起来欣赏宋小宝的小品烤串台词!欢迎阅读! ...
年度总结大会主持稿 年度总结大会主持稿(通用9篇)  总结是事后对某一时期、某一项目或某些工作进行回顾和分析,从而做出带...
会晚宴主持词 主题:突破·创新主持:A: B: C: D:放音乐 暖场1 暖场2晚会开始前五分钟 此音乐完毕后主持...
新世纪福音战士渚薰的经典台词 新世纪福音战士渚薰的经典台词  新世纪福音战士渚薰是具有生命之果的使徒,和凌波丽一样,是一个人造人。...
运动会开幕式流程主持词 运动会开幕式流程主持词范文(精选7篇)  根据活动对象的不同,需要设置不同的主持词。在如今这个中国,...
妙手仁心1经典台词 妙手仁心1经典台词大全  1.如果两个人有共同的秘密,表示两人的关系已是非比寻常的了。  2.喜欢一...
新婚回门宴会主持词 新婚回门宴会主持词尊敬的各位来宾,女士们,先生们:  大家中午好!  受今天新婚回门庆典主人的委托,...
销售晨会主持词开场白 销售晨会主持词开场白   篇一:销售晨会主持词  销售晨会主持词  首先在这个阳光明媚,生机昂然的早...
婚礼喝交杯酒主持词 婚礼喝交杯酒主持词范文(精选6篇)  主持词的写作要突出活动的主旨并贯穿始终。随着中国在不断地进步,...
婚宴的致辞 婚宴的致辞合集15篇  在平日的学习、工作和生活里,大家都尝试过写致辞吧,致辞具有有张有弛、错落有致...
运动会方阵解说词 运动会方阵解说词运动会方阵解说词运动会方阵解说词范文一:1、国旗解说词。女:四位旗手手执鲜艳的五星红...