2016-09-29 135 views
6

我在星火加入一些DataFrames在一起,我不斷收到以下錯誤:星火2.0.0錯誤:PartitioningCollection要求所有的分割中具有相同的numPartitions

PartitioningCollection requires all of its partitionings have the same numPartitions. 

這似乎發生後,我加盟兩個數據框在一起,每個看起來都相當合理,但在加入它們後,如果我嘗試從連接的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)dataFrame1dataFrame2加入之前和resultDataFrame加入後,但似乎沒有任何影響的錯誤。我一直無法找到其他人在一些粗略的谷歌搜索後得到錯誤的參考...

回答

8

我在過去幾天遇到了同樣的問題,當我在互聯網上沒有找到引用時,我感到很失望。直到你的!

我會補充幾件事:在數據框(多個連接)上執行一組相當複雜的操作後,我得到錯誤。而且,這些操作涉及從同一父數據幀生成的數據幀。 我想要一個最小的例子來複制它,但它從我的管道中提取它並不是微不足道的。

我懷疑當DAG變得太複雜時,Spark可能會在計算正確的計劃時遇到麻煩。 不幸的是,如果它是Spark 2.0.0中的一個bug,那麼nightly builds還沒有修復它(幾天前我已經嘗試了2.0.2快照)。

A 實用的解決方案修復問題(暫時)似乎是:寫入磁盤(在某個時間點)您的管道中的一些數據幀,並再次閱讀它們。這有效地迫使Spark有一個更小,更易管理的優化計劃,而且它不會再崩潰。當然,這只是一個臨時修復。

+0

感謝您對整合的展示以及可能希望成爲有用但即將公認的臨時解決方案的示範。我會嘗試一下,但是我認爲如果解決方案似乎沒有掌握更多的stackoverflow,我們可能會有一些錯誤報告。 –

+0

還要注意,在版本1.6.x上,相同的代碼(禁止非常小的差異)按預期工作,不會崩潰,所以它聽起來像是一個錯誤。 –

+0

你的臨時解決方案確實解決了這個問題!我毫不猶豫地將它標記爲答案,除非沒有其他人迴應,否則我們決定前往火花JIRA,那麼也可以,但謝謝。 –

7

我也有同樣的問題。對我來說,它發生在刪除連接的選擇部分(而不是連接子句本身)的一些列之後。

我能夠通過在數據幀上調用.repartition()來修復它。

+0

謝謝。這是一個比以上更好的解決方案! – StackPointer

3

您是否調用緩存方法?

只有當我使用緩存方法時,這個問題纔會發生在我身上。 如果我不調用這個方法,我可以毫無問題地使用這些數據。