2016-09-22 149 views
0

使用VectorAssembler我得到了以下數據框(假設它已經是一個數據幀):在星火

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

,我要的列(不是全部)結合起來,一列,並使其成爲RDD數組[Double]。我正在做以下事情:

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")} 

回答

3

正確的解決方法(假設星火2.0+,在1.x中使用o.a.s.mllib.linalg.Vector):

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

output.map(_.getAs[Vector]("features").toArray) 
  • ml/mllibVectorVectorAssembler創建的與scala.collection.Vector不一樣。
  • Row.getAs應與期望的類型一起使用。它不執行任何類型轉換,並且o.a.s.ml(lib).linalg.Vector不是Array[Double]