我希望将k-mean聚类应用于我的数据,这些数据是在Scala中以sqlContext.sql()
查询生成的DataFrame格式。我可以使用“.rdd”将其转换为RDD。
正如我从Spark的网站上的文档和单个示例中所理解的那样,KMeans.train
期望RDD向量。
我的数据包含两个字段userid
和avg
。我想要的是根据它们在Double类型中的相关userid
值来聚类avg
。
目前我有:
val queryResult = sqlContext.sql(s"some-query") // | userid(String) | avg(Double) |
val trainData = queryResult.rdd
val clusters = KMeans.train(trainData, numClusters, numIterations)
导致此错误:
<console>:46: error: type mismatch;
found : org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]
required: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector]
这个例子暗示了这样的做法:
val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache()
但我无法弄清楚如何将其更改为包含avg
数据的RDD向量,并以某种方式映射到userid
。
如何格式化输入数据以使k-mean群集按预期运行?