在提出问题之前,我想指出一点,我对火花没有任何了解,我上周在研究团队制定的一个项目中开始对它有所了解。我必须对他们的代码进行一些调整,而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?如果有人可以帮助,请。感谢您的关注。
答案 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