繁体   English   中英

如何将RDD [Row]转换为RDD [Vector]

[英]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

因此,我正在寻找一种执行该转换的方法,但是找不到任何方法。

任何想法?

最好的祝福

这里至少有两个问题:

  1. 不,您确实不能将行强制转换为向量:行是Spark SQL理解的可能不同类型的集合。 Vector不是本机Spark SQL类型
  2. 您的SQL语句的内容与您尝试使用KMeans实现的内容之间似乎不匹配:SQL正在执行聚合。 但是KMeans希望使用Vector(封装Array[Double] )形式的一系列单个数据点。 那么,那么-为什么KMeans运算提供sumaverage呢?

在这里仅处理#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM