代码之家  ›  专栏  ›  技术社区  ›  Gakuo

使用scala中的RDD和集合

  •  0
  • Gakuo  · 技术社区  · 6 年前

    我有下面的函数,它采用类似类型的方法数组( type Likes=Int ) 以及一个类似类型数量的RDD(像矢量)。对于likesVector RDD中的每个数字,它计算平均数数组中每个平均数的距离,并选择距离最小的平均数。( val distance = (mean-number).abs )而我期望的结果是 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 回复  |  直到 6 年前
        1
  •  0
  •   anuj saxena    6 年前

    空映射的原因是您正在使用 ++ 本线操作:

    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中使用易变性。