我在Pyspark工作时使用lambda函数,如下所示:
udf_func = UserDefinedFunction(lambda value: method1(value, dict_global), IntegerType())
result_col = udf_func(df[atr1])
方法1的实现是下一个:
def method1(value, dict_global):
result = len(dict_global)
if (value in dict_global):
result = dict_global[value]
return result
'dict_global'是一个包含一些值的全局字典。
问题是当我执行lambda函数时,结果总是None。由于任何原因,'method1'函数不会将变量'dict_global'解释为外部变量。为什么?我该怎么办?
答案 0 :(得分:4)
最后我找到了解决方案。我在下面写下:
在SPARK中执行的Lambda函数(以及map和reduce函数)调度不同执行程序之间的执行,并且它在不同的执行线程中工作。所以我的代码中的问题可能是全局变量有时不会被不同线程中并行执行的函数捕获,所以我寻找一个解决方案来尝试解决它。
幸运的是,在SPARK中有一个名为"Broadcast"的元素,它允许将变量传递给执行者之间组织的函数的执行,以便毫无问题地使用它们。有两种类型的可共享变量:广播(不可变变量,仅用于读取)和累加器(可变变量,但只接受数值)。
我重写了我的代码,向您展示我是如何解决问题的:
broadcastVar = sc.broadcast(dict_global)
udf_func = UserDefinedFunction(lambda value: method1(value, boradcastVar), IntegerType())
result_col = udf_func(df[atr1])
希望它有所帮助!