【发布时间】:2016-05-27 16:52:10
【问题描述】:
我正在尝试使用 scala 实现 k-means 方法。 我创建了一个类似的 RDD
val df = sc.parallelize(data).groupByKey().collect().map((chunk)=> {
sc.parallelize(chunk._2.toSeq).toDF()
})
val examples = df.map(dataframe =>{
dataframe.selectExpr(
"avg(time) as avg_time",
"variance(size) as var_size",
"variance(time) as var_time",
"count(size) as examples"
).rdd
})
val rdd_final=examples.reduce(_ union _)
val kmeans= new KMeans()
val model = kmeans.run(rdd_final)
使用此代码我得到一个错误
type mismatch;
[error] found : org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]
[error] required:org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector]
所以我尝试着做:
val rdd_final_Vector = rdd_final.map{x:Row => x.getAs[org.apache.spark.mllib.linalg.Vector](0)}
val model = kmeans.run(rdd_final_Vector)
然后我得到一个错误:
java.lang.ClassCastException: java.lang.Double cannot be cast to org.apache.spark.mllib.linalg.Vector
所以我正在寻找一种方法来进行该演员,但我找不到任何方法。
有什么想法吗?
最好的问候
【问题讨论】:
-
是的,我读过但不明白。我看到“密集”和“getAs”的错误。我将 val rdd_final_Vector 更改为: val rdd_final_Vector= rdd_final.map{ row => Vectors.dense(row.getAs[Seq[Double]].toArray) } 但我收到错误:(