当在调用它的函数外部定义了UDF时,Pyspark错误:方法__getnewargs __([])不存在

时间:2018-12-04 22:19:19

标签: pyspark apache-spark-sql aws-glue

我已经看到了几个与此有关的问题,但是我似乎不明白为什么当我在数据框上调用的函数之外定义了UDF时会出现此错误。

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

from data.utils import PropertiesGetter

glueContext = GlueContext(SparkContext.getOrCreate())

input_source = glueContext.create_dynamic_frame.from_catalog(database = "db_name", table_name = "input")
input_source_df = input_source.toDF()

test_df = PropertiesGetter(glueContext).add_subscription_properties(input_df)

当我的类如下(请注意嵌套的UDF)时,在input_df上调用PropertiesGetter的add_subscription_properties不会引发错误:

class PropertiesGetter(object):
    def __init__(self, gc):
        ...

    def add_subscription_properties(self, input_df):
        def _add_subscription_properties(self, subscription_name):
            subscription_mapping = {...}
            return subscription_mapping[subscription_name]
        udf_add_subscription_properties = udf(_add_subscription_properties, StringType())
        return input_df.withColumn("subscription_properties", 
                                   udf_add_subscription_properties("subscription_type"))

    ...

但是确实会引发错误 (特别是Could not serialize object: Py4JError: An error occurred while calling o116.__getnewargs__. Trace: py4j.Py4JException: Method __getnewargs__([]) does not exist..),如下所示:

class PropertiesGetter(object):
    def __init__(self, gc):
        ...

    def _add_subscription_properties(self, subscription_name):
        subscription_mapping = {...}
        return subscription_mapping[subscription_name]

    def add_subscription_properties(self, input_df):
        udf_add_subscription_properties = udf(self._add_subscription_properties, StringType())
        return input_df.withColumn("subscription_properties", 
                                   udf_add_subscription_properties("subscription_type"))

    ...

有人可以向我解释为什么吗?我正在努力了解为什么这有所作为。我在此类中使用了一些UDF,所以我想知道嵌套其中一些UDF的方法。

P.S。我知道您不需要UDF创建应用映射的列,而只是想在一个简单的示例上进行演示。

0 个答案:

没有答案