【问题标题】:MAX and MIN value of RDD[scala.collection.immutable.Map[String,Any]RDD[scala.collection.immutable.Map[String,Any] 的 MAX 和 MIN 值
【发布时间】:2016-04-21 21:13:53
【问题描述】:

在下面的代码中,我计算了每个文档到 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)
}

【问题讨论】:

  • 您的映射是Map[String,Any] 类型,因为键"id" 映射到String"distance" 映射到Double,而Any 是它们的通用基类。
  • 你说得对。感谢您为我指明正确的方向。显然,“id”和“distance”两个值都有相似的数据类型(String 和 Double),所以必须有一个公共类。

标签: scala apache-spark rdd


【解决方案1】:

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

val values = rdd.flatMap(_.values.map(_.toDouble)).cache()
val min = values.min()
val max = values.max()

【讨论】:

  • 您的代码运行良好,解决了我的问题。谢谢!
【解决方案2】:

最简单的方法是首先将输出直接映射到正确的格式。

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) }

这应该允许您使用内置的 min 和 max 函数或使用您编写的函数。


【讨论】:

    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2016-05-23
    • 2020-08-11
    • 2023-03-19
    • 2018-09-20
    相关资源
    最近更新 更多