9

我在 Spark 中将一些 DataFrames 连接在一起,但我不断收到以下错误:

PartitioningCollection requires all of its partitionings have the same numPartitions.

这似乎发生在我将两个 DataFrame 连接在一起之后,每个 DataFrame 本身看起来都相当合理,但是在加入它们之后,如果我尝试从连接的 DataFrame 中获取一行,我会收到这个错误。我真的只是想了解为什么会出现此错误或其背后的含义,因为我似乎找不到任何文档。

以下调用导致此异常:

val resultDataframe = dataFrame1
  .join(dataFrame2,     
    $"first_column" === $"second_column").take(2)

但我当然可以打电话

dataFrame1.take(2)

dataFrame2.take(2)

我还尝试在加入之前和加入之前使用或重新分区,加入之后DataFrames重新Dataset.repartition(numPartitions)分区,但似乎没有任何影响该错误。经过一些粗略的谷歌搜索后,我无法找到其他人得到错误的参考......Dataset.coalesce(numParitions)dataFrame1dataFrame2resultDataFrame

4

4 回答 4

9

最近几天我遇到了同样的问题,当我在互联网上找不到参考资料时,我感到很失望。直到你的!

我要补充几件事:在对数据帧(多个连接)进行一组非常复杂的操作后出现错误。此外,这些操作涉及从同一父数据帧生成的数据帧。我试图有一个最小的例子来复制它,但从我的管道中提取它并不是一件容易的事。

我怀疑当 DAG 变得太复杂时,Spark 可能在计算正确计划时遇到麻烦。不幸的是,如果它是 Spark 2.0.0 中的一个错误,那么夜间构建似乎还没有修复它(我几天前尝试了 2.0.2 快照)。

(暂时)解决问题的一个实用解决方案似乎是:(在某个时候)将管道中的一些数据帧写入磁盘,然后再次读取它们。这有效地迫使 Spark 有一个更小、更易于管理的优化计划,而且它不再崩溃。当然,这只是一个临时修复。

于 2016-09-30T14:07:17.703 回答
9

我也有同样的问题。对我来说,它发生在从连接的选择部分(不是连接子句本身)中删除一些列之后。

我能够通过调用数据框来修复它.repartition()

于 2016-10-19T08:14:42.270 回答
3

你调用缓存方法吗?

这个问题只有在我使用缓存方法时才会发生在我身上。如果我不调用此方法,我可以毫无问题地使用数据。

于 2017-07-13T11:06:35.023 回答
1

此问题已在 Spark 2.3.0 中ReorderJoinPredicates 修复

于 2018-06-19T15:09:40.410 回答