VectorAssembler的功能有些令人讨厌。 我目前正在将一组列转换为一列 向量然后使用StandardScaler函数应用缩放 到包含的功能。但是,似乎SPARK用于记忆 原因,决定是否应使用DenseVector或SparseVector来表示每行功能。 但是,当您需要使用StandardScaler时,SparseVector的输入 无效,只允许DenseVectors。有人知道解决方案吗?
修改 我决定只使用一个UDF函数来改变它 稀疏的矢量成密集的矢量。有点傻但是有效。
答案 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()