Pyspark中的lambda函数无法识别全局变量

jar*_*fly 4 python lambda global nonetype pyspark

我在Pyspark中使用如下lambda函数工作:

udf_func = UserDefinedFunction(lambda value: method1(value, dict_global), IntegerType())
result_col = udf_func(df[atr1])
Run Code Online (Sandbox Code Playgroud)

下一个是method1的实现:

def method1(value, dict_global):
    result = len(dict_global)
    if (value in dict_global):
        result = dict_global[value]
    return result
Run Code Online (Sandbox Code Playgroud)

'dict_global'是包含一些值的全局词典。

问题是,当我执行lambda函数时,结果始终为“无”。由于任何原因,“ method1”函数都不会将变量“ dict_global”解释为外部变量。为什么?我能做什么?

jar*_*fly 5

终于我找到了解决方案。我写在下面:

在SPARK中执行的Lambda函数(以及map和reduce函数)在不同的执行器之间调度执行,并且在不同的执行线程中工作。因此,我的代码中的问题可能是全局变量有时无法被在不同线程中并行执行的函数捕获,因此我寻找一种解决方案来尝试解决它。

幸运的是,在SPARK中,有一个称为“广播”的元素,该元素允许将变量传递给执行者之间组织的功能的执行,以便与他们一起工作而不会出现问题。可共享变量有两种类型:广播(不可变变量,仅用于读取)和累加器(可变变量,但仅接受数值)。

我重写了代码以向您展示如何解决该问题:

broadcastVar = sc.broadcast(dict_global)
udf_func = UserDefinedFunction(lambda value: method1(value, boradcastVar), IntegerType())
result_col = udf_func(df[atr1])
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!