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

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...