我有兩個大的csv文件預分列的列之一。有沒有辦法使用這樣一個事實,即他們已經被排序以更快地獲得新的排序後的RDD,而無需再次進行完全排序?如何合併火花中的兩個預分類的rdds?
回答
簡而言之:沒有辦法利用這兩個輸入RDD在使用Apache Spark提供的分類功能時已經分類的事實。
漫長的回答:在某些條件下,可能會有比使用sortBy
或sortByKey
更好的方法。
最明顯的情況是輸入RDD已經排序並表示不同的範圍。在這種情況下,假設rdd1
中的所有元素都位於rdd2
(根據所選順序)中的所有元素之前,簡單地使用rdd1.union(rdd2)
是組合輸入RDD的最快(幾乎爲零成本)方法。
當輸入RDD的範圍重疊時,事情變得更加棘手。假設目標RDD只應具有一個分區,則在兩個RDD上使用toLocalIterator
可能會很有效,然後手動進行合併。如果結果必須是RDD,則可以在自定義RDD類型的compute
方法內執行此操作,處理輸入RDD並生成輸出。
當輸入很大並且由多個分區組成時,情況會變得更加棘手。在這種情況下,您可能還需要輸出RDD中有多個分區。您可以使用前面提到的自定義RDD,但創建多個分區(使用RangePartitioner
)。每個分區將覆蓋一系列不同的元素(在最佳情況下,這些範圍將涵蓋大致相同大小的輸出部分)。
這個棘手的部分是避免在compute
內多次處理完整的輸入RDD。當輸入RDD正在使用RangePartitioner
時,可以使用filterByRange
從OrderedRDDFunctions
有效避免此問題。如果他們沒有使用RangePartitioner
,但您知道分區在內部排序並且也具有全局排序,則首先需要通過實際探查數據來找出這些分區覆蓋的有效範圍。
由於多分區情況比較複雜,我會檢查自定義排序是否比簡單使用sortBy
或sortByKey
更快。 sortBy
和sortByKey
的邏輯針對洗牌過程(在節點之間傳輸數據)進行了高度優化。由於這個原因,很多情況下這些方法比定製邏輯更快,即使定製的邏輯可能是O(n),而O(n log(n))可能是O(n)最好。
如果您有興趣瞭解更多關於Apache Spark使用的混洗邏輯,有一個article解釋基本概念。
- 1. 分上下兩個RDDS的值火花(蟒蛇)
- 2. 如何合併兩個不同類型的流RDDs
- 3. 存在於兩個不同的RDDS階火花
- 4. 火花 - 加入2個配對RDDS
- 5. 如何星火合併兩個RDDS如果存儲在關鍵值相匹配
- 6. 分解星火RDDS
- 7. 火花:加擾RDDS和壓縮它們
- 8. 如何Concat的兩個火花
- 9. 在scala中結合了兩個RDDs spark
- 10. 如何分組並加入火花?
- 11. 火花如何合併一個數據幀的列的兩個字段(字符串類型),生成日期
- 12. 什麼樣的RDDS的火花可以保存到使用saveAsNewAPIHadoopDataset
- 13. 星火:合併兩個dataframes
- 14. 如何執行火花兩個查詢
- 15. 如何在火花中將rdd數據分成兩部分?
- 16. 如何檢查火花中的兩個DataFrame列的交集
- 17. 如何使用scala + spark比較兩個rdds?這兩個rdds都沒有鑰匙?
- 18. 如何在PHP中合併兩個類?
- 19. 如何通過火花中的多個鍵組合?
- 20. 如何在火花中分發任務
- 21. SVN如何合併類似的文件樹(合併兩個分支)
- 22. 聯合使用不同列的兩個火花數據幀
- 23. 如何合併兩個張量在火炬網絡的開始?
- 24. 如何火花
- 25. 火花流聚合
- 26. 火花:如何從火花外殼運行火花文件
- 27. 如何合併兩個SVN分支?
- 28. 將火花數據幀中的多行合併到一行中
- 29. 火花階分裂串並轉換具有兩列
- 30. 如何使用火花外殼的兩個版本?