我是新來的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)
請幫
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
以上評論中提到的解決方案實際上適用於我,但我不確定是否有正確的方法來做到這一點 – Yogesh