apache-spark - 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 正在改组加入,因此似乎没有发生广播加入。
我的问题是:为什么会这样?当我缓存一个数据帧时,如何避免洗牌?
非常感谢
解决方案
尝试
firstDf.join(broadcast(secondDf), Seq....)
不知道为什么缓存会有所作为,Spark 有时有点不可预测。
您可以尝试写入secondDf
磁盘并将其读回而不是缓存,如果它很小,那么这样做的开销将是最小的。
推荐阅读
- java - 如何将java类字段转换为字符串值数组
- c++ - 如何比在 C++ 中使用 qsort 更快地对一百万个数字进行分组?
- hadoop - 如何从hadoop将数据导出到大型机
- c# - 将数据从数据库拖到列表框
- java - 为什么特定 Guava Stopwatch.elapsed() 调用比其他调用晚得多?(在帖子中输出)
- database - 我在哪里可以找到一些示例价目表数据库?
- python - 如何在 sphinx 中更改 pybtex 引用的样式
- .net - 为什么 CORS 不适用于此配置?
- excel - 如何根据 Excel 中的 ID 列复制和同步表?
- excel - “this”表上的单元格具有“that”表上的单元格的单元格地址。我正在尝试更改“那个”表上单元格的内容