如何在PySpark数据帧中将ArrayType转换为DenseVector?

16

我在构建一个机器学习Pipeline时遇到了以下错误:

pyspark.sql.utils.IllegalArgumentException: 'requirement failed: Column features must be of type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 but was actually ArrayType(DoubleType,true).'

我的features列包含一系列浮点值。看起来我需要将它们转换为某种向量(不是稀疏向量,所以是DenseVector?)。是否可以直接在DataFrame上执行此操作或者我需要将其转换为RDD?


在计算向量范数时,我遇到了同样的问题。我使用了pyspark.ml.functions中的array_to_vector将数组列转换为向量类型。只有在pyspark>=3.1.0中才可用。更多细节请参见:stackoverflow.com/a/48333361/2650427。 - TrigonaMinima
1个回答

28

你可以使用UDF:

udf(lambda vs: Vectors.dense(vs), VectorUDT())

在Spark < 2.0中导入:

from pyspark.mllib.linalg import Vectors, VectorUDT

在Spark 2.0+中导入:

from pyspark.ml.linalg import Vectors, VectorUDT

请注意,尽管实现相同,但这些类不兼容。

还可以提取单个特征并与 VectorAssembler 组合。假设输入列名为 features

from pyspark.ml.feature import VectorAssembler

n = ... # Size of features

assembler = VectorAssembler(
    inputCols=["features[{0}]".format(i) for i in range(n)], 
    outputCol="features_vector")

assembler.transform(df.select(
    "*", *(df["features"].getItem(i) for i in range(n))
))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接