首页 > 解决方案 > Apache Spark:广播连接不适用于缓存的数据帧

问题描述

当我加入两个数据框时:

 val secondDf= sparkSession.read.parquet(inputPath)
 joinedDf = firstDf.join(secondDf, Seq("ID"), "left_outer")

Spark 似乎进行了广播连接,并且没有发生改组。

但是一旦我缓存了较小的 Df:

 val secondDf= sparkSession.read.parquet(inputPath).cache()
 joinedDf = firstDf.join(secondDf, Seq("ID"), "left_outer")

Spark 正在改组加入,因此似乎没有发生广播加入。

我的问题是:为什么会这样?当我缓存一个数据帧时,如何避免洗牌?

非常感谢

标签: apache-sparkspark-dataframe

解决方案


尝试

firstDf.join(broadcast(secondDf), Seq....)

不知道为什么缓存会有所作为,Spark 有时有点不可预测。

您可以尝试写入secondDf磁盘并将其读回而不是缓存,如果它很小,那么这样做的开销将是最小的。


推荐阅读