【问题标题】:pyspark expected zero arguments for construction of ClassDict (for pyspark.mllib.linalg.DenseVector)pyspark 预期构建 ClassDict 的参数为零(对于 pyspark.mllib.linalg.DenseVector)
【发布时间】:2016-11-09 23:56:32
【问题描述】:

我得到了错误

构造 ClassDict 的预期参数为零(对于 pyspark.mllib.linalg.DenseVector)

试试这个:

我有一个函数,我将其转换为 udf,用于从数据框中转换列的值。像这样:

def func(vector):
   #does something

   return Vector.dense(vector)

udfunc = udf(func, ArrayType(FloatType()))

new_df = df.withColumn("vector",func(df.vector))
new_df.show()

df.vector 列具有denseVector 值。

有人有解决这个问题的想法或提示吗?

提前致谢

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql user-defined-functions apache-spark-mllib


    【解决方案1】:

    鉴于您提供的部分,明显的问题是您声明了错误的返回类型。 Vector 的催化剂类型是 VectorUDT 而不是 ArrayType(FloatType())

    from pyspark.mllib.linalg import Vectors, VectorUDT
    from pyspark.sql.types import ArrayType, FloatType
    from pyspark.sql.functions import udf
    
    dummy_udf = udf(lambda _: Vectors.dense([0, 0, 0]), VectorUDT())
    
    sc.parallelize([(Vectors.dense([1, 1, 1]), )]).toDF(["x"]).select(dummy_udf("x"))
    

    在 Spark 2.0 及更高版本中使用pyspark.ml.linalg 来实现与pyspark.ml API 的兼容性。

    【讨论】:

    • 现在修复了!感谢您的帮助!
    • 我还有一个问题@zero323。如果我只返回一个向量 return Vector.dense(vector) 我得到错误: TypeError: cannot serialize array([ ...]) of type 我应该使用哪种数据类型?
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2021-07-31
    • 2020-07-25
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多