我正在尝试使用python functools partial来创建一个与spark rdd map函数一起使用的函数。问题是闭包包括不在群集任务节点上的文件。解决这个问题的最佳方法是什么?我想做的是:
def f(row, p1, p2):
...
def transform(rdd, p1, p2):
mapF = functools.partial(f, p1=p1, p2=p2)
return rdd.map(mapF)
但我得到的错误是编写此代码的模块不存在。我知道我可以使用spark选项将代码发送到其他节点 - 但此时我在一个jupyter笔记本中处于开发模式 - 使用固定参数启动一次spark应用程序,我必须找到一种hacky方式(我认为)手动将更新的文件提供给任务节点。
另一件事就是放弃我在全局范围内的好函数,如果我把它放在我的转换函数中,那么我可以使用partial,这就行了:
def transform(rdd, p1, p2):
def f(row, p1, p2):
...
mapF = functools.partial(f, p1=p1, p2=p2)
return rdd.map(mapF)