我创建的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
以此类推所有按键
答案 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))