Scala ApacheSpark K-Means群集-用于输入的RDD

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

我试图在分组数据上运行Spark的k-means聚类,但是当我尝试对每个组进行聚类时,会出现各种错误

输入RDD看起来像(userID:Long,coords:[Vector]),即:

该矢量包含X Y坐标,即成对的双精度坐标。我想为每个用户标识标识坐标簇,所以我在RDD上映射,并尝试为每个组运行k-means:

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