我有一个特征列,它使用 Spark 的 VectorAssembler 打包成向量向量,如下所示。data
是输入 DataFrame(类型为spark.sql.DataFrame
).
val featureCols = Array("feature_1","feature_2","feature_3")
val featureAssembler = new VectorAssembler().setInputCols(featureCols).setOutputCol("features")
val dataWithFeatures = featureAssembler.transform(data)
我正在使用以下方法开发自定义分类器Classifier
and ClassificationModel
开发者API。ClassificationModel
需要开发一个predictRaw()
从模型输出预测标签向量的函数。
def predictRaw(features: FeaturesType) : Vector
该函数由API设置并带有一个参数,其特点是FeaturesType
并输出一个向量(在我的例子中,我将其视为 SparkDenseVector
as DenseVector
延长了Vector
特征)。
由于VectorAssembler的封装,features
列的类型Vector
每个元素本身就是每个训练样本的原始特征的向量。例如:
特征列 - Vector 类型
[1.0, 2.0, 3.0] - element1,本身是一个向量
[3.5, 4.5, 5.5] - element2,本身是一个向量
我需要将这些特征提取到Array[Double]
为了实施我的predictRaw()
逻辑。理想情况下,我希望得到以下结果以保留基数:
`val result: Array[Double] = Array(1.0, 3.5, 2.0, 4.5, 3.0, 4.5)`
即按列优先顺序,因为我会将其转换为矩阵。
我试过了:
val array = features.toArray // this gives an array of vectors and doesn't work
我还尝试将功能输入为 DataFrame 对象而不是 Vector,但由于 VectorAssembler 中的功能打包,API 需要 Vector。例如,此函数本身可以工作,但不符合 API,因为它期望 FeaturesType 为 Vector,而不是 DataFrame:
def predictRaw(features: DataFrame) :DenseVector = {
val featuresArray: Array[Double] = features.rdd.map(r => r.getAs[Vector](0).toArray).collect
//rest of logic would go here
}
我的问题是features
属于类型Vector
, not DataFrame
。另一种选择可能是打包features
as a DataFrame
但我不知道如何在不使用的情况下做到这一点VectorAssembler
.
感谢所有建议,谢谢!我看过Spark DataFrame 中向量的访问元素(逻辑回归概率向量) https://stackoverflow.com/questions/44425159/access-element-of-a-vector-in-a-spark-dataframe-logistic-regression-probability但这是用Python编写的,我使用的是Scala。