如何计算Spark RDD的平均值?

lee*_*lee 7 scala apache-spark rdd

我在Spark Scala中遇到问题,我想从Rdd数据中计算平均值,我创建了这样的新RDD,

[(2,110),(2,130),(2,120),(3,200),(3,206),(3,206),(4,150),(4,160),(4,170)]
Run Code Online (Sandbox Code Playgroud)

我想这样数

[(2,(110+130+120)/3),(3,(200+206+206)/3),(4,(150+160+170)/3)]
Run Code Online (Sandbox Code Playgroud)

然后,得到这样的结果,

   [(2,120),(3,204),(4,160)]
Run Code Online (Sandbox Code Playgroud)

如何使用RDD中的scala做到这一点?我使用Spark版本1.6

Aka*_*thi 5

groupByKey在这种情况下你可以使用。像这样

val rdd = spark.sparkContext.parallelize(List((2,110),(2,130),(2,120),(3,200),(3,206),(3,206),(4,150),(4,160),(4,170)))
val processedRDD = rdd.groupByKey.mapValues{iterator => iterator.sum / iterator.size}
processedRDD.collect.toList
Run Code Online (Sandbox Code Playgroud)

在这里,groupByKey将返回RDD[(Int, Iterator[Int])] 然后您可以简单地应用平均操作Iterator

希望这对你有用

谢谢


小智 5

您可以使用aggregateByKey。

val rdd = sc.parallelize(Seq((2,110),(2,130),(2,120),(3,200),(3,206),(3,206),(4,150),(4,160),(4,170)))
val agg_rdd = rdd.aggregateByKey((0,0))((acc, value) => (acc._1 + value, acc._2 + 1),(acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2))
val sum = agg_rdd.mapValues(x => (x._1/x._2))
sum.collect
Run Code Online (Sandbox Code Playgroud)