如何在用户定义的函数udf中返回Pandas.Series?

时间:2019-07-31 15:19:03

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

在提出问题之前,我想指出一点,我对火花没有任何了解,我上周在研究团队制定的一个项目中开始对它有所了解。我必须对他们的代码进行一些调整,而pandas_udf函数让我很难受。

研究小组的代码中有一个带有某些方法的类,该类之外有5个pandas_udf方法使用全局变量来操纵数据。我正在做的修改是删除这些全局变量,并在类中获取这5个pandas_udf方法,这样做时我出错了。

这是代码:

class Signal(object):
    # some methods, __init__, etc, etc


    def propagate(self, column1):
        signal_list = []
        # some code and return a list
        return signal_list

    @pandas_udf(ArrayType(StringType()),  PandasUDFType.SCALAR)
    def propagate_signal(self, signal_column):
        return signal_column.apply(
            self.propagate,
            column1=signal_column
        )

    def execute(self):
        # some code...
        dataframe = dataframe.withColumn('col_name', self.propagate_signal(dataframe['col_name']))

在这里我遇到了错误,我做了一些重新测试,比较了这两个代码,并在调试模式下同时执行了这两个代码,并发现执行pandas_udf方法时不会出现自已参数并导致错误,而原始代码中的方法没有自参数,并且执行得很好。然后我想到了一个嵌套函数。

def propagate_signal(self, signal_column):
    @pandas_udf(ArrayType(StringType()), PandasUDFType.SCALAR)
    def propagate_signal_nested(signal_column):
        signal_column.apply(self.propagate, column1=signal_column)

    return = propagate_signal_nested(signal_column)

它起作用了(我认为它起作用是因为它是从这里通过的,不是从该行通过的),但是在此行之后,我无法将这个spark数据框转换为pandas数据框(请注意,在此行之前我可以调用dataframe.toPandas()并执行它,并且可以看到dataframe),当我在该行之后调用dataframe.toPandas()时,我得到了一个错误TypeError: Return type of the user-defined function should be Pandas.Series, but is <class 'NoneType'>并也得到了错误{{1 }},我尝试进行搜索,并获得了有关ERROR TaskSetManager: Task 0 in stage 5.0 failed 1 times; aborting job的一些建议,增加了内存,但没有用。

在这整个历史之后,这里有一个简单的问题,这个parallelize函数正确吗,我在返回上做错了什么,如何使它返回pandas.Series?如果有人可以帮助,请。感谢您的关注。

1 个答案:

答案 0 :(得分:2)

好像您在return中没有pandas_udf语句。因此,默认情况下,python为您返回None。 尝试这样的事情:

    @pandas_udf(ArrayType(StringType()), PandasUDFType.SCALAR)
    def propagate_signal_nested(signal_column):
        ps = signal_column.apply(self.propagate, column1=signal_column)
        return ps