在Spark中使用RDD查找键的平均值

时间:2019-04-18 11:48:30

标签: scala apache-spark rdd

我创建的RDD的第一列为Key,其余列为该键的值。每行都有一个唯一的键。我想找到每个键的平均值。我创建了键值对并尝试了以下代码,但未产生预期的结果。我的代码在这里。

val rows = 10
val cols = 6
val partitions = 4
lazy val li1 = List.fill(rows,cols)(math.random)
lazy val li2 = (1 to rows).toList
lazy val li =  (li1, li2).zipped.map(_ :: _)
val conf = new SparkConf().setAppName("First spark").setMaster("local[*]")
val sc = new SparkContext(conf)
val rdd = sc.parallelize(li,partitions)

val gr = rdd.map( x => (x(0) , x.drop(1)))
val gr1 = gr.values.reduce((x,y) => x.zip(y).map(x => x._1 +x._2 )).foldLeft(0)(_+_)
gr1.take(3).foreach(println)

我希望结果显示为

1 => 1.1 ,
2 => 2.7

以此类推所有按键

1 个答案:

答案 0 :(得分:0)

首先,我不确定这行在做什么,

lazy val li =  (li1, li2).zipped.map(_ :: _)

相反,您可以这样做

lazy val li =  li2 zip li1

这将创建类型为Int,List [Double]的元组列表。

找到针对键的平均值的解决方案如下所示

rdd.map{ x => (x._1, x._2.fold(0.0)(_ + _)/x._2.length) }.collect.foreach(x => println(x._1+" => "+x._2))