Spark SQL 关联策略选择

Spark SQL 关联策略选择

前面分别从关联形式与实现机制这两个方面对关联进行了介绍,对于不同关联形式的用法和实现机制的原理,想必你已经了然于胸。不过,在大数据的应用场景中,数据的处理往往是在分布式的环境下进行的,在这种情况下,数据关联的计算还要考虑网络分发这个环节。

我们知道,在分布式环境中,Spark 支持两类数据分发模式。一类是 Shuffle,Shuffle 通过中间文件来完成 Map 阶段与 Reduce 阶段的数据交换,因此它会引入大量的磁盘与网络开销。另一类是广播变量(Broadcast Variables),广播变量在 Driver 端创建,并由 Driver 分发到各个 Executors。

因此,从数据分发模式的角度出发,数据关联又可以分为 Shuffle Join 和 Broadcast Join 这两大类。将两种分发模式与 Join 本身的 3 种实现机制相结合,就会衍生出分布式环境下的 6 种 Join 策略。

那么,对于这 6 种 Join 策略,Spark SQL 是如何支持的呢?它们的优劣势与适用场景都有哪些?开发者能否针对这些策略有的放矢地进行取舍?今天这一讲,咱们就来聊聊这些话题。

Join 实现机制的优势对比

首先,我们先来说一说不同 Join 实现机制本身的一些特性与适用场景,从而为后续的讨论打好基础。需要说明的是,咱们这里说的 Join 实现机制,指的是算法层面的工作原理,不同的算法有着不同的适用场景与复杂度,我们需要对它们有足够认识并有所区分。

我们知道,Join 支持 3 种实现机制,它们分别是 Hash Join、Sort Merge Join 和 Nested Loop Join。三者之中,Hash Join 的执行效率最高,这主要得益于哈希表 O(1) 的查找效率。不过,在 Probe 阶段享受哈希表的“性能红利”之前,Build 阶段得先在内存中构建出哈希表才行。因此,Hash Join 这种算法对于内存的要求比较高,适用于内存能够容纳基表数据的计算场景

相比之下,Sort Merge Join 就没有内存方面的限制。不论是排序、还是合并,SMJ 都可以利用磁盘来完成计算。所以,在稳定性这方面,SMJ 更胜一筹。

而且与 Hash Join 相比,SMJ 的执行效率也没有差太多,前者是 O(M),后者是 O(M + N),可以说是不分伯仲。当然,O(M + N) 的复杂度得益于 SMJ 的排序阶段。因此,如果准备参与 Join 的两张表是有序表,那么这个时候采用 SMJ 算法来实现关联简直是再好不过了

与前两者相比,Nested Loop Join 看上去有些多余,嵌套的双层 for 循环带来的计算复杂度最高:O(M * N)。不过,尺有所短寸有所长,执行高效

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值