RDD[scala.collection.immutable.Map[String,Any] 的最大值和最小值
MAX and MIN value of RDD[scala.collection.immutable.Map[String,Any]
在下面的代码中,我计算了每个文档到 KMeans 集群中的集群质心的欧氏距离。
我觉得欧几里得距离没有多大意义,所以我认为将它标准化为从 0 到 1 的比例会更好。
不幸的是,我没有弄清楚如何对 org.apache.spark.rdd.RDD[scala.collection.immutable.Map[String,Any]]
数据类型进行排序或如何获取最大值/最小值。
事实上它是 RDD[Map[String,Double]]
但我想它由于某种原因被转换为 RDD[Map[String,Any]]
。大多数方法,例如 takeOrdered
结果:
error: No implicit Ordering defined for 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)
}
如果我没理解错的话,您需要全局 min/max 值,存储在地图中。如果是这样,您可以将 RDD 展平并将其映射到 RDD[Double]:
val values = rdd.flatMap(_.values.map(_.toDouble)).cache()
val min = values.min()
val max = values.max()
最简单的方法是首先将输出直接映射到正确的格式。
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)
}
这应该允许您使用内置的最小和最大函数或使用您编写的函数。
在下面的代码中,我计算了每个文档到 KMeans 集群中的集群质心的欧氏距离。 我觉得欧几里得距离没有多大意义,所以我认为将它标准化为从 0 到 1 的比例会更好。
不幸的是,我没有弄清楚如何对 org.apache.spark.rdd.RDD[scala.collection.immutable.Map[String,Any]]
数据类型进行排序或如何获取最大值/最小值。
事实上它是 RDD[Map[String,Double]]
但我想它由于某种原因被转换为 RDD[Map[String,Any]]
。大多数方法,例如 takeOrdered
结果:
error: No implicit Ordering defined for 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)
}
如果我没理解错的话,您需要全局 min/max 值,存储在地图中。如果是这样,您可以将 RDD 展平并将其映射到 RDD[Double]:
val values = rdd.flatMap(_.values.map(_.toDouble)).cache()
val min = values.min()
val max = values.max()
最简单的方法是首先将输出直接映射到正确的格式。
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)
}
这应该允许您使用内置的最小和最大函数或使用您编写的函数。