2016-08-26 29 views

回答

1

簡而言之:沒有辦法利用這兩個輸入RDD在使用Apache Spark提供的分類功能時已經分類的事實。

漫長的回答:在某些條件下,可能會有比使用sortBysortByKey更好的方法。

最明顯的情況是輸入RDD已經排序並表示不同的範圍。在這種情況下,假設rdd1中的所有元素都位於rdd2(根據所選順序)中的所有元素之前,簡單地使用rdd1.union(rdd2)是組合輸入RDD的最快(幾乎爲零成本)方法。

當輸入RDD的範圍重疊時,事情變得更加棘手。假設目標RDD只應具有一個分區,則在兩個RDD上使用toLocalIterator可能會很有效,然後手動進行合併。如果結果必須是RDD,則可以在自定義RDD類型的compute方法內執行此操作,處理輸入RDD並生成輸出。

當輸入很大並且由多個分區組成時,情況會變得更加棘手。在這種情況下,您可能還需要輸出RDD中有多個分區。您可以使用前面提到的自定義RDD,但創建多個分區(使用RangePartitioner)。每個分區將覆蓋一系列不同的元素(在最佳情況下,這些範圍將涵蓋大致相同大小的輸出部分)。

這個棘手的部分是避免在compute內多次處理完整的輸入RDD。當輸入RDD正在使用RangePartitioner時,可以使用filterByRangeOrderedRDDFunctions有效避免此問題。如果他們沒有使用RangePartitioner,但您知道分區在內部排序並且也具有全局排序,則首先需要通過實際探查數據來找出這些分區覆蓋的有效範圍。

由於多分區情況比較複雜,我會檢查自定義排序是否比簡單使用sortBysortByKey更快。 sortBysortByKey的邏輯針對洗牌過程(在節點之間傳輸數據)進行了高度優化。由於這個原因,很多情況下這些方法比定製邏輯更快,即使定製的邏輯可能是O(n),而O(n log(n))可能是O(n)最好。

如果您有興趣瞭解更多關於Apache Spark使用的混洗邏輯,有一個article解釋基本概念。