Apache Spark:广播连接不适用于缓存的数据帧

Posted

技术标签:

【中文标题】Apache Spark:广播连接不适用于缓存的数据帧【英文标题】:Apache Spark: Broadcast join not workling for cached dataframe 【发布时间】:2018-05-09 18:51:02 【问题描述】:

当我加入两个数据框时:

 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 正在改组加入,因此似乎没有发生广播加入。

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

非常感谢

【问题讨论】:

【参考方案1】:

试试

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

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

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

【讨论】:

以上是关于Apache Spark:广播连接不适用于缓存的数据帧的主要内容,如果未能解决你的问题,请参考以下文章

sparksql缓存表能做广播变量吗

用于多个连接的 Spark SQL 广播 [重复]

带有广播连接的 Spark 流式传输

socket.io 广播不适用于 React

自动检查互联网的广播接收器不适用于果冻豆或奇巧

Spark 1.5.1 不适用于 hive jdbc 1.2.0