当我将两个数据帧连接为:
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加入了连接,因此似乎没有广播加入。
我的问题是:为什么会这样?当我缓存一个数据帧时,如何避免混乱?
非常感谢
答案 0 :(得分:0)
尝试
firstDf.join(broadcast(secondDf), Seq....)
不确定为什么缓存应该有所作为,有时候Spark有点不可预测。
您可以尝试将secondDf
写入磁盘并将其读回而不是缓存,如果它很小,那么这样做的开销很小。