无法使用scala在spark中使用groupByKey对2个值执行聚合

问题描述 投票:1回答:2

这个问题是关于使用scala的spark中的groupByKey()。

考虑以下数据

Name,marks,value
Chris,30,1
Chris,35,1
Robert,12,1
Robert,20,1

创建如下

val dataRDD = sc.parallelize(List(("Chris",30,1),("Chris",35,1),("Robert",12,1),("Robert",20,1)))

我正在尝试创建一个这样的键值对

val kvRDD = dataRDD.map(rec=> (rec._1, (rec._2,rec._3)))

现在我想要两个值的总和。

val sumRDD = kvRDD.groupByKey().map(rec => (rec._1,(rec._2._1.sum, rec._2._2.sum)))

但是,我面临以下错误。

<console>:28: error: value _2 is not a member of Iterable[(Int, Int)]

我们不能使用groupByKey达到要求吗?

scala apache-spark rdd
2个回答
1
投票

而不是groupByKey,我建议使用更有效的reduceByKey

val dataRDD = sc.parallelize(Seq(
  ("Chris",30,1), ("Chris",35,1), ("Robert",12,1), ("Robert",20,1)
))

val kvRDD = dataRDD.map(rec => (rec._1, (rec._2, rec._3)))

val sumRDD = kvRDD.reduceByKey{ (acc, t) =>
  (acc._1 + t._1, acc._2 + t._2)
}

sumRDD.collect
// res1: Array[(String, (Int, Int))] = Array((Robert,(32,2)), (Chris,(65,2)))

1
投票

kvRDD的价值是arraytuple所以你可以直接和array值相加,你可以这样做

val sumRDD=kvRDD.groupByKey.map(rec=>(rec._1,(rec._2.map(_._1).sum,rec._2.map(_._2).sum)))

//Output
scala> sumRDD.collect
res11: Array[(String, (Int, Int))] = Array((Robert,(32,2)), (Chris,(65,2)))
© www.soinside.com 2019 - 2024. All rights reserved.