【问题标题】:working with RDDS and collections in Scala在 Scala 中使用 RDDS 和集合
【发布时间】:2018-07-13 14:01:06
【问题描述】:

我有以下函数,它采用 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
      }

【问题讨论】:

  • 我不了解您的操作背景。你能用一些输入和输出更新你的问题吗

标签: scala rdd


【解决方案1】:

你的空地图的原因是你在这一行使用++操作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 2016-03-12
    • 2015-12-16
    • 2017-09-06
    • 2010-10-31
    • 2020-10-06
    • 2011-10-18
    • 2023-03-14
    相关资源
    最近更新 更多