在Spark中使用VectorAssembler

时间:2016-09-22 17:28:31

标签: apache-spark apache-spark-ml

我得到了以下数据帧(假设它已经是数据帧):

val df = sc.parallelize(Seq((1, 2, 10), (3, 4, 11), (5, 6, 12)))
           .toDF("a", "b", "c")

我希望将列(不是全部)组合到一列,并使其成为Array [Double]的rdd。我正在做以下事情:

import org.apache.spark.ml.feature.VectorAssembler
val colSelected = List("a","b")
val assembler = new VectorAssembler()
    .setInputCols(colSelected.toArray)
    .setOutputCol("features")
val output = assembler.transform(df).select("features").rdd

直到这里没关系。现在输出是格式为RDD[spark.sql.Row]的数据帧。我无法将其转换为RDD[Array[Double]]格式。无论如何?

我尝试了类似以下的内容,但没有成功:

output.map { case Row(a: Vector[Double]) => a.getAs[Array[Double]]("features")}

1 个答案:

答案 0 :(得分:3)

正确的解决方案(假设Spark 2.0+,在1.x中使用o.a.s.mllib.linalg.Vector):

import org.apache.spark.ml.linalg.Vector

output.map(_.getAs[Vector]("features").toArray)
    ml创建的
  • mllib / Vector VectorAssemblerscala.collection.Vector不同。
  • Row.getAs应与预期类型一起使用。它不执行任何类型转换,o.a.s.ml(lib).linalg.Vector不是Array[Double]