将数据帧转换为Vector.dense以获得k均值

时间:2017-05-03 20:43:27

标签: scala apache-spark k-means

回答这个问题 How to convert type Row into Vector to feed to the KMeans

我为我的数据创建了功能表。(assembler是一个矢量汇编程序)

val kmeanInput  = assembler.transform(table1).select("features")

当我使用kmeanInput

运行k-means时
val clusters = KMeans.train(kmeanInput, numCluster, numIteration)

我收到错误

  

:102:错误:类型不匹配;发现:org.apache.spark.sql.DataFrame(扩展为)org.apache.spark.sql.Dataset [org.apache.spark.sql.Row]必需:org.apache.spark.rdd.RDD [org。 apache.spark.mllib.linalg.Vector] val clusters = KMeans.train(kmeanInput,numCluster,numIteration)

正如@Jed在他的回答中提到的,这是因为行不是Vectors.dense格式。 为了解决这个问题,我尝试了

 val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in 
 row["features"]]))

我收到此错误

  

:3:错误:')'预期但是'('找到.val dat = kmeanInput.rdd.map(lambda row:Vectors.dense([x for x in row [“features”])))

     

:3:错误:';'预期,但')'发现。 val dat = kmeanInput.rdd.map(lambda row:Vectors.dense([x for x in row [“features”]]))

1 个答案:

答案 0 :(得分:0)

您导入了错误的库,您应该使用KMeans中的ml而不是mllib。第一个使用DataFrame,第二个使用RDD