将 Dataframe 转换为 Vector.dense 以获得 k-mean

Converting Dataframe to Vector.dense for k-mean

关注这个问题的答案

我已经为我的数据创建了特征 table。(assembler 是矢量汇编器)

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

当我 运行 k-均值 kmeanInput

val clusters = KMeans.train(kmeanInput, numCluster, numIteration)

我收到错误

:102: error: type mismatch; found : org.apache.spark.sql.DataFrame (which expands to) org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] required: 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: error: ')' expected but '(' found. val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in row["features"]]))

:3: error: ';' expected but ')' found. val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in row["features"]]))

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