VectorAssembler只输出到DenseVector?

ml_*_*_0x 5 apache-spark pyspark

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

编辑: 我决定只使用UDF函数,将稀疏矢量转换为密集矢量.有点傻但有效.

max*_*max 7

您是对的,VectorAssembler根据使用较少内存的任何一种来选择密集与稀疏输出格式。

您不需要 UDF 即可从 转换SparseVectorDenseVector;只需使用toArray()方法

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

此外,除非您在创建时设置,否则StandardScaler接受。如果确实需要去均值,则必须从所有分量中减去一个(大概是非零的)数字,这样稀疏向量就不再是稀疏的了。SparseVectorwithMean=True