在Scala中使用RDDS和集合

时间:2018-07-12 19:31:20

标签: scala rdd

我有下面的函数,该函数采用类型为Likes(type Likes=Int)的方法的数组 以及编号为Likes(likesVector)的数字的RDD。对于likesVector RDD中的每个数字,它计算与均值数组中每个均值的距离,并选择距离最小(val distance = (mean-number).abs)的均值。当我期望得到Map[Likes,Array[Likes]]类型的结果时,我得到一个空的映射。 Map[Likes,Array[Likes]]代表(mean->Array of number-nearest numbers)。 实现此目标的最佳方法是什么?我怀疑这与Scala集合的可变性有很大关系。

def assignDataPoints(means:Array[Likes],likesVector:RDD[Likes]): Map[Likes,Array[Likes]] ={         
        var likes_Mean = IntMap(1->1)
        var likes_mean_final = mutable.Map.empty[Likes,Array[Likes]]
        likesVector.map(dataPoint => {
          means.foldLeft(Array.empty[Likes])( (accumulator, mean)=> {
            val dist= computeDistance(dataPoint,mean)
            val nearestMean = if (dist < accumulator(0)) {
              accumulator(0)=dist
              accumulator(0)
            } else{
              accumulator(0)
            }
            val b= IntMap(nearestMean.toInt -> dataPoint)
            println("b:"+ b)
            likes_mean_final ++ likes_Mean.intersectionWith(b,(_, av, bv: Likes) => Array(av, bv))
            accumulator
          })})        
        likes_mean_final.toMap
      }

1 个答案:

答案 0 :(得分:0)

清空地图的原因是您在此行中使用++操作:

likes_mean_final ++ likes_Mean.intersectionWith(b,(_, av, bv: Likes) => Array(av, bv))

++操作返回一个新映射,因此我们正在创建一个新对象,而不更改当前值

用于更改当前可变映射的操作为++=。所以你应该使用:

likes_mean_final ++= likes_Mean.intersectionWith(b,(_, av, bv: Likes) => Array(av, bv))

在您的上下文中也无需使用var,因为您没有将值重新分配给相同的引用。

但是您不应该在Scala中使用可变性。