使用Vector Assembler并提取"功能"作为spark scala中的org.apache.spark.mllib.linalg.Vectors

时间:2016-03-01 22:33:17

标签: apache-spark

我想在Spark 1.5.1中使用高斯混合模型,该模型使用linalg.mllib.vector rdd。

这是我的代码

import org.apache.spark.mllib.clustering.GaussianMixture
import org.apache.spark.mllib.clustering.GaussianMixtureModel
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.DataFrameNaFunctions
dummy = dummy.na.drop
var colnames= dummy.columns
var df = dummy

for(x<-colnames)
{ 
    if (dummy.select(x).dtypes(0)._2.equals("StringType") || dummy.select(x).dtypes(0)._2.equals("LongType"))
    { df = df.drop(x)}

}

var colnames = df.columns
var assembler = new VectorAssembler().setInputCols(colnames).setOutputCol("features")
var output = assembler.transform(df)
var temp = output.select("features")

问题是我无法将功能列更改为org.apache.spark.mllib.linalg.Vector rdd

任何人都知道如何做到这一点?

1 个答案:

答案 0 :(得分:2)

Spark&gt; = 2.0

地图:

temp.rdd.map(_.getAs[org.apache.spark.mllib.linalg.Vector]("features"))

或使用as

temp
  .select("features")
  .as[Tuple1[org.apache.spark.ml.linalg.Vector]]
  .rdd.map(_._1)

Spark&lt; 2.0

map超过RDD[Row]并提取字段:

temp.rdd.map(_.getAs[org.apache.spark.mllib.linalg.Vector]("features"))