RDD的MAX和MIN值[scala.collection.immutable.Map [String,Any]

时间:2016-04-21 12:22:55

标签: scala apache-spark rdd

在下面的代码中,我计算了每个文档到KMeans集群中的集群质心的欧氏距离。 我觉得欧几里德的距离没有多大意义,所以我认为将它从0到1的标准化会更好。

不幸的是,我没有弄清楚如何对org.apache.spark.rdd.RDD[scala.collection.immutable.Map[String,Any]]数据类型进行排序或如何获取最大/最小值。

实际上它是RDD[Map[String,Double]]但我认为由于某种原因它已转换为RDD[Map[String,Any]]。大多数方法,例如takeOrdered导致:

  

错误:没有为scala.collection.immutable.Map定义隐式排序[String,Any]

如何教Scala如何对此Map的Any值进行排序? 任何提示都非常感谢。

由于

val score = rdd.map({case(id,vector) => {distToCentroid(id, vector, model_1)}})

// Normalizing the data with normalizeResult function.
// Problem I need to find the max and minimum beforehand        
def distToCentroid(id: String, datum: Vector, model: KMeansModel) = {
  val cluster = model.predict(datum)
  val centroid = model.clusterCenters(cluster)
  val distance = math.sqrt(centroid.toArray.zip(datum.toArray).map(p => p._1 - p._2).map(d => d * d).sum)
  Map("id" -> id, "distance" -> distance)
}

def normalizeResult(max: Double, min: Double, x: Double) = { 
  (x-min) / (max-min)
}

2 个答案:

答案 0 :(得分:2)

如果我理解你的话,你需要全局最小值/最大值来存储在地图中。如果是这样,您可以展平您的RDD并将其映射到RDD [Double]:

@objc
    class func getPosts() -> RACSignal {
        let signalProducer: SignalProducer<String, NSError> =  SignalProducer {
            observer, disposable in
            }
        return signalProducer.toRACSignal()
    }

答案 1 :(得分:0)

最简单的方法是在第一个实例中将输出直接映射到正确的格式。

def distToCentroid(id: String, datum: Vector, model: KMeansModel) = { val cluster = model.predict(datum) val centroid = model.clusterCenters(cluster) val distance = math.sqrt(centroid.toArray.zip(datum.toArray).map(p => p._1 - p._2).map(d => d * d).sum) //Updated Outputs Map("id" -> id, "distance" -> distance.toDouble) }

这应该允许您使用内置的最小和最大函数或使用您编写的函数。