我得到了以下数据帧(假设它已经是数据帧):
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")}
答案 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
VectorAssembler
与scala.collection.Vector
不同。Row.getAs
应与预期类型一起使用。它不执行任何类型转换,o.a.s.ml(lib).linalg.Vector
不是Array[Double]
。