2015-05-21 187 views
1

我想對使用apache spark的關鍵記錄對的關鍵字進行排序。密鑰長度爲10個字節,值大約爲90個字節。換句話說,我試圖複製用於break the sorting record的排序基準Databricks。我從文檔中注意到的一件事是,他們對鍵行號對進行了排序,而不是對關鍵記錄對進行排序,以便可能對緩存/ tlb友好。我試圖複製這種方法,但還沒有找到合適的解決方案。這是我曾嘗試:有序的火花RDD聯盟

var keyValueRDD_1 = input.map(x => (x.substring(0, 10), x.substring(12, 13))) 
var keyValueRDD_2 = input.map(x => (x.substring(0, 10), x.substring(14, 98)) 
var result = keyValueRDD_1.sortByKey(true, 1) // assume partitions = 1 
var unionResult = result.union(keyValueRDD_2) 
var finalResult = unionResult.foldByKey("")(_+_) 

當我這樣做的結果RDD和keyValueRDD_2 RDD工會和打印unionResultRDD,結果和keyValueRDD_2的輸出沒有被交織。換句話說,它看起來像unionResult RDD具有keyValueRDD_2內容和結果RDD內容。但是,當我執行將同一個鍵的值組合到單個鍵 - 值對中的foldByKey操作時,排序的順序被破壞。我需要通過鍵操作進行摺疊,以便將結果保存爲原始鍵記錄對。是否有可用於實現此功能的替代rdd函數?

任何提示或建議將是非常有用的。 謝謝

+0

您是否試過'RDD.zip'和/或'RDD.zipWithIndex'? –

+0

我對RDD zip的理解是,它會將兩個RDD元素的元素明智地壓縮。因此,當一個RDD被命令時,另一個RDD不會被排序,並且會導致@daniel指出的相同問題。謝謝。 –

回答

2

union方法只是一個接一個放兩個RDD,除非它們具有相同的分區器。然後它加入分區。

你想做什麼是不可能的。

當你有一個RDD排序(keyValueRDD_1),並使用相同的按鍵(keyValueRDD_2)然後又無序RDD獲得第二個RDD排序是排序的唯一途徑。

排序的RDD的存在並不能幫助我們排序第二個RDD。

Databricks article討論執行者本地發生的優化。在洗牌步驟之後,記錄大致分類。現在每個分區都包含一系列密鑰,但分區是未分類的。

現在您必須在本地對每個分區進行排序,這是前綴優化有助於緩存局部性的地方。

+0

我明白了。是的,這是有道理的。所以,這個前綴優化已經內置在Spark引擎中,或者應該以這種優化被使用的方式進行編碼,這是我需要探索的。但是,是的,我明白上述是不可能的,而且我傾向於這樣的結果。謝謝@丹尼爾。 –