如何解决使用 Spark Scala 按元素计算数组的总和
我正在尝试在 Spark Scala 中实现 Kmeans 聚类。
所以目前我有一个看起来像这样的 RDD- 它包含聚类中心和数据点。
scala> res2.collect
res54: Array[(Int,Array[Any])] = Array((2,Array(19,15,39)),(2,Array(21,81)),Array(20,16,6)),(1,Array(23,77)),Array(31,17,40)),(3,Array(22,76)),Array(35,18,94)),Array(64,19,3)),Array(30,72)))
我的下一步是根据数组的键对数组进行元素求和,并将结果除以计数(通过求平均值找到新的质心集)。
我无法弄清楚如何实现这一点,因为简单地使用 reduceByKey(__+_) 不适用于数组。
解决方法
ReduceByKey 应该适用于数组。通过计数,我假设您的意思是与给定键关联的元素数量,可以使用 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)
}
,
这是我的解决方案:
import spark.implicits._
val df = spark.sparkContext.parallelize(Array((2,Array(19,15,39)),(2,Array(21,81)),Array(20,16,6)),(1,Array(23,77)),Array(31,17,40)),(3,Array(22,76)),Array(35,18,94)),Array(64,19,3)),Array(30,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|
+---+---+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。