使用spark scala的数组元素求和

2wnc66cl  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(596)

我试图在spark scala中实现kmeans集群。
所以现在我有一个rdd,它看起来像这样-它包含集群中心和数据点。

scala> res2.collect
res54: Array[(Int, Array[Any])] = Array((2,Array(19, 15, 39)), (2,Array(21, 15, 81)), (2,Array(20, 16, 6)), (1,Array(23, 16, 77)), (2,Array(31, 17, 40)), (3,Array(22, 17, 76)), (1,Array(35, 18, 6)), (3,Array(23, 18, 94)), (1,Array(64, 19, 3)), (1,Array(30, 19, 72)))

我的下一步是根据数组的键对数组进行elementwise求和,并将结果除以计数(通过求平均值来找到新的质心集)。
我不知道如何实现这一点,因为简单地使用reducebykey(\ uuuuykey+\)对数组不起作用。

h9vpoimq

h9vpoimq1#

reducebykey应该与数组一起工作。通过count,我假设您的意思是与给定键相关联的元素的数量,可以通过countbykey()找到。这种方法应该有效:

val keycount = your_rdd.countByKey()
def reduceSum(a1: Array[Int], a2: Array[Int]): Array[Int] = {
  Array(a1(0)+a2(0),a1(1)+a2(1),a1(2)+a2(2))
}
val summed = your_rdd.reduceByKey(reduceSum)
val combined = keycount.join(summed)
combined.map{
  case (idx, (count, arr)) => arr.map(1.0*arr / count) 
}
3b6akqbq

3b6akqbq2#

以下是我的解决方案:

import spark.implicits._

  val df = spark.sparkContext.parallelize(Array((2,Array(19, 15, 39)), (2,Array(21, 15, 81)), (2,Array(20, 16, 6)), (1,Array(23, 16, 77)), (2,Array(31, 17, 40)), (3,Array(22, 17, 76)), (1,Array(35, 18, 6)), (3,Array(23, 18, 94)), (1,Array(64, 19, 3)), (1,Array(30, 19, 72))))

  df.map(line => {

    val sumValues = line._2.sum/line._2.size;

    (line._1, sumValues)

  } ).reduceByKey(_+_).toDF("key","avg").show();

输出

|key|avg|
+---+---+
|  1|125|
|  3| 83|
|  2|106|
+---+---+

相关问题