使用combineByKey添加列表的相应值

时间:2016-02-09 12:15:16

标签: scala apache-spark

如何在scala中使用combineByKey在scala中添加多维元组

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)......

3 个答案:

答案 0 :(得分:1)

此处没有理由使用combineByKey。它可以通过简单的reduce轻松处理:

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

答案 1 :(得分:0)

你应该使用reduceByKey:

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

答案 2 :(得分: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)))