我创建了RDD,第一列是Key,其余列是针对该键的值。每行都有一个唯一的密钥。我想找到每个键的平均值。我创建了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
等等所有按键
首先,我不确定这条线是做什么的,
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))