Scala ApacheSpark K-Means群集-用于输入的RDD
我试图在分组数据上运行Spark的k-means聚类,但是当我尝试对每个组进行聚类时,会出现各种错误 输入RDD看起来像(userID:Long,coords:[Vector]),即: 该矢量包含X Y坐标,即成对的双精度坐标。我想为每个用户标识标识坐标簇,所以我在RDD上映射,并尝试为每个组运行k-means:Scala ApacheSpark K-Means群集-用于输入的RDD,scala,machine-learning,apache-spark,Scala,Machine Learning,Apache Spark,我试图在分组数据上运行Spark的k-means聚类,但是当我尝试对每个组进行聚类时,会出现各种错误 输入RDD看起来像(userID:Long,coords:[Vector]),即: 该矢量包含X Y坐标,即成对的双精度坐标。我想为每个用户标识标识坐标簇,所以我在RDD上映射,并尝试为每个组运行k-means: val userClusters = userCoordVectors.map { case (userId, coords) => val clusters = 4
val userClusters = userCoordVectors.map {
case (userId, coords) =>
val clusters = 4
val iterations = 30
// Need to convert coords to RDD for input into K-Means
val parsedData = sc.parallelize(coords)
// Apply k-means
val model = KMeans.train(parsedData, clusters, iterations)
...
etc
}
但当我运行此程序时,我会从线路中得到一个NPE:
val parsedData = sc.parallelize(coords)
问题是,对于K-Means操作,我必须将坐标转换为RDD
另一方面,如果我先收集输入RDD,那么我就不会得到NPE。相反,我得到了一个Java堆错误,可能是因为我正在实现整个RDD
val userClusters = sc.parallelize(userCoordVectors.collect.map {
...
})
在这个RDD中收集数据在这里似乎是错误的,所以我认为应该有更好的方法,但我不知道如何让parsedData行工作
有人能看到我在这里尝试使用K-Means的过程中有什么明显的错误吗,或者建议如何实现在每个组中对我的数据进行聚类的目标吗?您不能在RDD操作符的任何函数中使用SparkContext或RDD。它们无法序列化并通过网络发送 Matei Zaharia在这里回答说: 目前,您无法在Spark任务中使用SparkContext,因此在这种情况下,您必须调用某种本地K-means库。您可以尝试使用的一个示例是Weka()。然后,您可以使用SparkContext.wholeTextFiles将文本文件作为字符串的RDD加载,并对每个文本文件调用Weka
好的,听起来很有说服力。谢谢你的提示。韦卡。我也可以试试PySpark和一个pythonml库。
val userClusters = sc.parallelize(userCoordVectors.collect.map {
...
})