【问题标题】:How to convert ArrayType to DenseVector in PySpark DataFrame?如何在 PySpark DataFrame 中将 ArrayType 转换为 DenseVector?
【发布时间】:2016-12-25 19:51:54
【问题描述】:

我在尝试构建 ML 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?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-mllib apache-spark-ml


    【解决方案1】:

    你可以使用UDF:

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

    在 Spark

    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))
    ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 2022-12-18
      相关资源
      最近更新 更多