[英]How to convert RDD[Row] to RDD[Vector]
我正在尝试使用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
因此,我正在寻找一种执行该转换的方法,但是找不到任何方法。
任何想法?
最好的祝福
这里至少有两个问题:
Spark SQL
理解的可能不同类型的集合。 Vector
不是本机Spark SQL类型 KMeans
实现的内容之间似乎不匹配:SQL正在执行聚合。 但是KMeans
希望使用Vector(封装Array[Double]
)形式的一系列单个数据点。 那么,那么-为什么KMeans
运算提供sum
和average
呢? 在这里仅处理#1:您将需要执行以下操作:
val doubVals = <rows rdd>.map{ row => row.getDouble("colname") }
val vector = Vectors.toDense{ doubVals.collect}
然后,您可以将封装Array[Double]
(在Vector内)提供给Kmeans
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.