Pyspark UDF比较稀疏向量

时间:2019-03-12 14:13:49

标签: python apache-spark pyspark user-defined-functions databricks

我正在尝试编写一个pyspark UDF,它将为我比较两个稀疏向量。我想写的是:

from pyspark.sql.functions import udf
from pyspark.sql.types import ArrayType, IntegerType, FloatType

def compare(req_values, values):
    return [req for req in req_values.indices if req not in values.indices]

compare_udf = udf(compare, ArrayType(IntegerType()))

display(data.limit(5).select('*', compare_udf('req_values', 'values').alias('missing')))

但是,当我运行此代码时,出现以下错误消息:

SparkException: Job aborted due to stage failure: Task 0 in stage 129.0 failed 4 times, most recent failure: Lost task 0.3 in stage 129.0 (TID 1256, 10.139.64.15, executor 2): net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.dtype)

在此之前,我遇到了类似的问题,这与数据帧类型无法处理numpy数据类型有关。以前,我能够通过将numpy数组强制返回到列表中来解决这些问题,但是在这种情况下,我什至无法将数据从SparseVector中拉出,例如,即使以下操作也不起作用:

def compare(req_values, values):
    return req_values.indices[0]   

compare_udf = udf(compare, IntegerType())

我已经能够使用RDD来解决问题,但是我仍然发现pyspark UDF令人沮丧。任何建议或帮助表示赞赏!

0 个答案:

没有答案