VectorAssembler只输出到DenseVector?

时间:2016-03-07 12:55:51

标签: apache-spark pyspark

VectorAssembler的功能有些令人讨厌。 我目前正在将一组列转换为一列 向量然后使用StandardScaler函数应用缩放 到包含的功能。但是,似乎SPARK用于记忆 原因,决定是否应使用DenseVector或SparseVector来表示每行功能。 但是,当您需要使用StandardScaler时,SparseVector的输入 无效,只允许DenseVectors。有人知道解决方案吗?

修改 我决定只使用一个UDF函数来改变它 稀疏的矢量成密集的矢量。有点傻但是有效。

2 个答案:

答案 0 :(得分:2)

你是对的VectorAssembler根据使用较少内存的选择密集与稀疏输出格式。

您不需要UDF即可将SparseVector转换为DenseVector;只需使用demo

from pyspark.ml.linalg import SparseVector, DenseVector 
a = SparseVector(4, [1, 3], [3.0, 4.0])
b = DenseVector(a.toArray())

此外,StandardScaler接受SparseVector,除非您在创建时设置withMean=True。如果你确实需要去均值,你必须从所有分量中扣除(可能是非零)数字,因此稀疏向量不再稀疏。

答案 1 :(得分:0)

在VectorAssembler将其转换为稀疏向量后,您可以将其转换为密集向量。

这就是我所做的,

创建DenseVector案例类

case class vct(features:Vector)

将稀疏矢量列转换为密集矢量列

val new_df = df.select("sparse vector column").map(x => { vct(x.getAs[org.apache.spark.mllib.linalg.SparseVector](1).toDense)}).toDF()