尝试在Apache Spark和Scala中的功能向量中创建所有功能的数组。我需要这样做,以创建一个微风矩阵,以示算法中的各种吸引力。当前,这些功能包裹在功能向量中,我想分别提取每个功能。我一直在研究以下问题:在Spark
中将iDextostring应用于特征向量这是我当前的代码:(数据是火花数据框架,所有功能均为双人)
val featureCols = Array("feature1", "feature2", "feature3")
val featureAssembler = new VectorAssembler().setInputCols(featureCols).setOutputCol("features")
val dataWithFeatures = featureAssembler.transform(data)
//now we slice the features back again
val featureSlicer = featureCols.map {
col => new VectorSlicer().setInputCol("features").setOutputCol(s"${col}_sliced").setNames(Array(s"${col}"))}
val output = featureSlicer.map(f => f.transform(dataWithFeatures).select(f.getOutputCol).as[Double].collect)
val array = output.flatten.toArray
然而,这会失败以下错误:'无法解析cast(由于数据类型不匹配而导致的" feature1"为double-无法将vectorudt铸造为doubletype'
这似乎很奇怪,因为我可以在没有错误的情况下进行以下操作:
val array: Array[Double] = dataWithFeatures.select("feature1").as[Double].collect()
任何想法如何解决此问题,如果有更好的方法,因为创建一系列数据范围并分别对操作执行操作似乎效率低下。
谢谢!
说明features
列是从所有其他功能列组装的vector
列,您可以选择features
列,将其转换为rdd
,然后flatMap
IT:
示例数据:
dataWithFeatures.show
+--------+--------+--------+-------------+
|feature1|feature2|feature3| features|
+--------+--------+--------+-------------+
| 1| 2| 3|[1.0,2.0,3.0]|
| 4| 5| 6|[4.0,5.0,6.0]|
+--------+--------+--------+-------------+
import org.apache.spark.ml.linalg.Vector
dataWithFeatures.select("features").rdd.flatMap(r => r.getAs[Vector](0).toArray).collect
// res19: Array[Double] = Array(1.0, 2.0, 3.0, 4.0, 5.0, 6.0)