使用Spark中的RDD查找密钥的平均值

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

我创建了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

等等所有按键

scala apache-spark rdd
1个回答
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))
© www.soinside.com 2019 - 2024. All rights reserved.