2015-04-22 65 views
2

我有一對RDD (K, V)與密鑰包含timeID。我想得到一個形式爲(K, Iterable<V>)的Pair RDD,其中鍵由id分組,並且迭代按時間排序。Spark按鍵排序,然後按組排序以獲得有序迭代?

我目前使用的是sortByKey().groupByKey(),我的測試似乎證明它可行,但我在閱讀時可能並非總是如此,正如在這個問題中分歧的回答(Does groupByKey in Spark preserve the original order?)所討論的那樣。

它是否正確?

謝謝!

+0

如果您需要更好的答案,請對其他問題給予獎勵。這是你提到的問題的重複。 –

回答

4

The answer from Matei,誰我認爲權威的關於這個主題,是很清楚的:

的順序是不實際保證,只有鑰匙在每個 分區結束。減速器可以以任意 的順序從地圖任務中獲取數據,具體取決於哪些數據首先可用。如果你想要一個 特定的順序,你應該排序每個分區。在這裏你可能是 得到它,因爲每個分區只有一個元素,並且collect()的確按順序返回分區。

在這種情況下,更好的選擇是將排序應用到每個鍵所產生的集合:

rdd.groupByKey().mapValues(_.sorted) 
+0

正確,取決於數據集(重複鍵的數量),但最好在較少的「行」上對它們進行排序,在它們已經通過分組進行摺疊之後進行排序。 –

+0

@MarkoBonaci這就是發生了什麼。在'groupByKey'之後,對結果分組進行排序以滿足問題中的要求。我不確定評論的內容。你能澄清嗎? – maasg

+0

我只是確認你最後一句話,並試圖解釋爲什麼這更好。我們很酷:) –

0

Spark Programming Guide提供了三種選擇,如果人們想要預見的訂購數據以下洗牌:

  • mapPartitions使用例如.sorted
  • 排序每個分區
  • repartitionAndSortWithinPartitions到同時重新分區
  • sortBy使高效地進行排序分區的全局排序RDD

作爲寫入Spark APIrepartitionAndSortWithinPartitions比調用重新分配,然後在每個分區內排序更有效,因爲它可以將分類推入洗牌機器。

然而,排序僅通過查看元組(K, V)的鍵K來計算。訣竅是將所有相關信息放在元組的第一個元素中,如((K, V), null),定義一個自定義分區和一個自定義排序。 This article描述很好的技術。