2016-02-09 44 views
0

我如何在Scala中使用combineByKey添加多維元組在斯卡拉使用combineByKey添加列表的相應值

val inputrdd = sc.parallelize(Seq(("maths", (50,2)), ("maths", (60,1)), ("english", (65,2)), ("physics", (66,3)), ("physics", (60,2)), ("physics", (87,1)))) 

這樣的,我收到輸出繼電器爲: (英語,65,2),(數學,110,3)...

回答

1

在這裏沒有理由使用combineByKey。它可以通過簡單的reduce好辦:

inputrdd 
    .reduceByKey{case ((x1, x2), (y1, y2)) => (x1 + y1, x2 + y2)} 
    .map{case (k, (v1, v2)) => (k, v1, v2)} 
0

你應該使用reduceByKey代替:

inputrdd.reduceByKey((x:(Int,Int), y:(Int,Int)) => (x._1+y._1,x._2+y._2)) 
inputrdd.collect() 
0

使用combineByKey

inputrdd.combineByKey((x:(Int,Int))=>(x._1,x._2),(u:(Int,Int),v:(Int,Int))=>(u._1+v._1,u._2+v._2),(acc1:(Int,Int),acc2:(Int,Int))=>(acc1._1+acc2._1,acc1._2+acc2._2)).collect 
    res135: Array[(String, (Int, Int))] = Array((maths,(110,3)), (physics,(213,6)), (english,(65,2))) 
解決以下
相關問題