2015-05-11 49 views
1

火花,可以組成多種RDD爲一體,採用拉鍊,聯合,加盟等..分解星火RDDS

是否有可能有效地分解RDD?也就是說,沒有對原始RDD執行多次傳遞?我所尋找的是一些事情類似:

val rdd: RDD[T] = ...  
val grouped: Map[K, RDD[T]] = rdd.specialGroupBy(...) 

一個RDDS的優勢是他們能夠高效地進行迭代計算。在我遇到的一些(機器學習)用例中,我們需要分別對每個組執行迭代算法。

目前的可能性我所知道的是:

  1. 的GroupBy:GROUPBY返回RDD [(K,可迭代[T])不給你組本身的RDD利益(的迭代器)。

  2. 聚合:比如reduceByKey,foldByKey等只對數據執行一次「迭代」,並且沒有實現迭代算法的表達能力。

  3. 使用過濾方法創建單獨的RDD並對數據進行多次傳遞(其中傳遞次數等於密鑰數量),但當密鑰數量不是非常小時不可行。

一些的用例我正在考慮是,給予了非常大的(表)數據集:

  1. 我們希望在每一個不同的列單獨執行一些迭代算法。例如,一些自動化的特徵提取,一種自然的方法是分解數據集,使得每個列將由單獨的RDD表示。

  2. 我們希望將數據集分解爲不相交的數據集(例如每天的數據集)並對它們中的每一個執行一些機器學習建模。

回答

0

我認爲最好的辦法是在一個單一的傳遞數據寫出每一個關鍵文件(見Write to multiple outputs by key Spark - one Spark job),那麼每個密鑰文件加載到每一個RDD。

+0

丹尼爾,我嘗試了上面的方法。你提出的問題是對象被寫成字符串,即你失去了類型。 我寫了下面的代碼(本地模式),它克服了這一問題: https://gist.github.com/MishaelRosenthal/108ebbbb7590c7d3104b 但由於某些原因,它是極其緩慢。 我懷疑的是,由於某種原因,它遍歷整個數據無數次。 –

+0

不知道,對不起。你的代碼在我看來。我自己並沒有試圖在實踐中這樣做,所以我不知道會有什麼樣的表現。也許你可以通過Spark UI(階段)瞭解它正在做什麼。 –