gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:38:37 24 4
gpt4 key购买 nike

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

udf_func = UserDefinedFunction(lambda value: method1(value, dict_global), IntegerType())
result_col = udf_func(df[atr1])

下一个是method1的实现:

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”解释为外部变量。为什么?我能做什么?

最佳答案

终于找到解决办法了。我写在下面:

在 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])

希望对您有所帮助!

关于python - Pyspark 中的 lambda 函数无法识别全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46486419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com