首页 > 解决方案 > Spark/Scala 更新另一个地图中的变量值?

问题描述

在 Spark 中,我有一个

closest: org.apache.spark.rdd.RDD[(Int, (breeze.linalg.Vector[Double], Int))] = MapPartitionsRDD[476] at map at command-1043253026161724:1

我想计算一些总距离:

var tempDist=0.0
closest.foreach(x=> tempDist=tempDist+squaredDistance(x._2._1, kPoints(x._1)))

但这根本不会改变tempDist's 的价值。我怀疑 Spark 什么也没做。那么如何计算距离呢?

标签: scalaapache-sparkrdd

解决方案


不要做可变变量。一般来说,这是一个坏主意,并且根本不适用于 spark,至少不是你这样做的方式,因为它是一个分布式系统。序列的不同分区位于不同的计算机上,并且在不同的 JVM中并行独立处理,每个 JVM 都有自己的var.

  val tempDist = closest
    .map { x => squaredDistance(x._2._1, kPoints(x._1) }
    .fold(0) { _ + _ }

推荐阅读