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

时间:2016-07-07 15:19:02

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

我收到错误

  

构造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值。

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

先谢谢

1 个答案:

答案 0 :(得分:6)

鉴于您提供的部分明显的问题是您声明了错误的返回类型。 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的兼容性。