笛卡尔积JOIN是如何为Join In Spark内部传输数据的?

4ioopgfo  于 2022-10-07  发布在  Spark
关注(0)|答案(1)|浏览(103)

我们有两种类型的嵌套循环连接在星火广播嵌套循环连接,洗牌复制嵌套循环连接(笛卡尔)

我知道在广播节点中,较小的表被广播到连接的所有节点。

我不确定笛卡尔连接中会发生什么。假设我们有2个 Dataframe A和B,那么A的每个分区都需要B的所有分区来连接。因此,在某种程度上,需要在存在A分区的所有节点中复制B。这不是和B被播出一样吗?请纠正我的理解。谢谢!

zengzsys

zengzsys1#

我会试一试的。如果需要,我鼓励对答案进行编辑以改进答案。

笛卡尔(交叉)连接是一种洗牌连接。混洗最好的定义是导致执行器内部/内部核心通信或数据共享的计算重新调整。Shuffle将结果联接到工作节点中,并可能在整个联接过程中每个执行器核心相互通信。它们非常昂贵,因为网络很容易受到工作节点之间过度通信造成的流量拥堵的影响。

注意不进行广播。使用分区属性的驱动程序可随意读取每个DF并将数据分发到工作节点。

为了演示没有广播,让我们交叉联接2个具有100000000行的DFS,并查看DAG。在本例中,2个DFS中的连接键也有字符串值和空格。在本例中,我有一个具有2个核心的工作节点

这两个DFS被读入Executor。联接键是并行分区的。这些联接键不会返回给驱动程序。每个执行器核心将分区保存在内存中,并将它们存储为随机文件。

接下来,笛卡尔乘积出现了。在计算新分区之前,合并上面输出的分区。

因为这是在驻留在工作节点上的一个执行器核心内发生的,所以没有进一步的数据交换。因此,分区被压缩,连接发生。结果被转发给驱动程序,驱动程序将结果传递给您的应用程序及其显示的内容。

相关问题