spark join的几种形式

https://www.2cto.com/net/201612/575696.html
1.Broadcast Join
在数据库的常见模型中(比如星型模型或者雪花模型),表一般分为两种:事实表和维度表。维度表一般指固定的、变动较少的表,例如联系人、物品种类等,一般数据有限。而事实表一般记录流水,比如销售清单等,通常随着时间的增长不断膨胀。
因为join操作是对两个表中key值相同的记录进行连接,在spark SQL中,对两个表做join最直接的方式是先根据key分区,再在每个分区中把key值相同的记录拿出来做连接操作。但这样就不可避免地涉及到shuffle,而shuffle在spark中是比较耗时的操作,我们应该尽可能的设计spark应用使其避免大量的shuffle。
当维度表和事实表进行join操作时,为了避免shuffle,我们可以将大小有限的维度表的全部数据分发到每个节点上,供事实表使用。executor存储维度表的全部数据,一定程度上牺牲了空间,换取shuffle操作大量的耗时,这在spark SQL中称为Broadcast Join.
看起来广播时一个比较理想的方案,但它有没有缺点呢?也很明显,这个方案只能用于广播较小的表,否则数据的冗余传输就远大于shuffle的开销;另外,广播时需要将被广播的表先collect到driver端,当频繁有广播出现时,对driver的内存也是一个考验。

2.shuffle hash join
由于spark是一个分布式的计算引擎,可以通过分区的形式将大批量的数据划分成n份较小的数据集进行并行计算。这种思想应用到join上便是shuffle hash join了。利用key相同必然分区相同的原理,spark SQL将较大表的join分而治之,先将表划分成n个分区,再对两个表中相对应分区的数据分别进行hash join。
shuffle hash join分为两步:
对两张表分别按照join keys进行分区,即shuffle,目的是为了让有相同join keys值的记录分到对应的分区中。
对对应分区中的数据进行join,此处先将小表分区构造一张hash表,然后根据大表分区中记录的join keys值拿出来进行匹配。

3.大表与大表之间的sort merge join
当两个表都非常大时,spark SQL采用Sort Merge Join进行Join,这种实现方式不用将一侧数据全部加载后再进行join,但需要在join前将数据排序。
首先将两张表按照join key进行了重新shuffle,保证join keys值相同的记录会被分在相同的分区。分区后对每个分区内的数据进行排序,排序后再对相应的分区内的记录进行连接。
因为两个序列都是有序的,从头遍历,碰到key相同的就输出;如果不同,左边小就继续取左边,反之取右边。
可以看出,无论分区有多大,Sort Merge Join都不用把某一侧的数据全部加载到内存中,而是即用即丢,从而大大提升了大数据量下SQL JOIN的稳定性。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性能优化指南》的...
    Alukar阅读 4,361评论 0 2
  • 原文:https://tech.meituan.com/spark-tuning-pro.html Spark性能...
    code_solve阅读 4,879评论 0 34
  • 1 数据倾斜调优 1.1 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spar...
    wisfern阅读 7,929评论 0 23
  • ‣ 浪一浪 颜料:温莎歌文 笔:秋宏斋系列 纸张:宝虹纯棉细纹16开 已经快脱胶的纸 耐着性子画完它 这抹蓝色 肆...
    里格喵MaoMi阅读 4,966评论 7 36
  • 浅黄点点灯光 清香阵阵金桂 拂袖染一襟浓淡 心绪浅浅深深重重
    溪畔姑娘阅读 1,007评论 0 2