2016-01-18 49 views
1

我是新來的Spark(使用1.1版本)和斯卡拉..我正在轉換我現有的Hadoop MapReduce代碼,以火花MR使用Scala和丟失。Spark:如何使用reduceByKey獲得相同的結果,就像我們通過使用groupByKey得到的任何替代解決方案?以避免洗牌

我希望我的映射RDD按鍵分組。當我在線閱讀時,建議我們應該避免groupByKey並使用reducedByKey來代替..但是當我應用reduceBykey時,我沒有按預期得到給定鍵的值列表由我的代碼=>例如。

val rdd = sc.parallelize(List(("k1", "v11"), ("k1", "v21"), ("k2", "v21"), ("k2", "v22"), ("k3", "v31"))) 

我的「價值」的實際任務是巨大的,具有鍵值300個加列對 當我將通過公共密鑰將導致洗牌,我希望避免做組。

我想從我的映射RDD像這樣的O/P(鍵,列表或值的數組)=>

rdd.groupByKey() 

這給了我下面的輸出

(k3,ArrayBuffer(v31)) 
(k2,ArrayBuffer(v21, v22)) 
(k1,ArrayBuffer(v11, v21)) 

但是,當我使用

rdd.reduceByKey((x,y) => x+y) 

我得到的值連接在一起就像下面 - 如果pipe('|')或其他一些易碎字符( (K2,V21 | V22))會一直存在我的問題會一直點點解決,但仍然有清單將是偉大的良好的編碼習慣

(k3,v31) 
(k2,v21v22) 
(k1,v11v21) 

請幫

回答

0

如果你是指火花文檔http://spark.apache.org/docs/latest/programming-guide.html

對於groupByKey它說 「當上的(K,V)對數據集調用,返回(K,可迭代)對一個數據集。」 可迭代的關鍵字是在這裏非常重要,當你得到值(v21,v22)是可迭代的。

而且它說 「注意:如果你是爲了執行聚集(如總和或平均值),在每個關鍵組,採用reduceByKey或aggregateByKey將產生更好的性能。」

所以從這是我理解的是,如果你想要返回的RDD有可迭代的值使用groupByKey,如果你想有一個像SUM一樣的加起來的值,然後使用reducebyKey。如果你有(String,ListBuffer(String))=>(K1,ListBuffer(「V1」)),那麼也許你現在在你的元組中而不是擁有(String,String)=>(K1,V1)可能已經完成rdd.reduceByKey((x,y)=> x + = y)

+0

U意味着已映射RDD的列表而不是字符串,例如=> http://apache-spark-user-list.1001560.n3 .nabble.com/Help-with-groupByKey-td2238.html => val rdd = sc.parallelize(List((「k1」,List(「v11」)),(「k1」,List(「v21」)) ,(「k2」,List(「v21」)),(「k2」,List(「v22」)),(「k3」,List(「k31」))))val reduceRDD = rdd.reduceByKey + _) – Yogesh

+0

以上評論中提到的解決方案實際上適用於我,但我不確定是否有正確的方法來做到這一點 – Yogesh

相關問題