我试图从Python方法中创建广播变量(尝试抽象一些我创建依赖于分布式操作的实用方法)。但是,我似乎无法从Spark工作者中访问广播变量。
我们说我有这个设置:
def main():
sc = SparkContext()
SomeMethod(sc)
def SomeMethod(sc):
someValue = rand()
V = sc.broadcast(someValue)
A = sc.parallelize().map(worker)
def worker(element):
element *= V.value ### NameError: global name 'V' is not defined ###
但是,如果我取消了SomeMethod()
中间人,那就可以了。
def main():
sc = SparkContext()
someValue = rand()
V = sc.broadcast(someValue)
A = sc.parallelize().map(worker)
def worker(element):
element *= V.value # works just fine
如果可以的话,我不必将所有Spark逻辑放在main方法中。有没有办法从本地函数中广播变量并让它们对Spark工作者全局可见?
或者,对于这种情况,什么是一个好的设计模式 - 例如,我想写一个专门针对Spark的方法,它是独立的并执行特定的功能我想重复使用?
答案 0 :(得分:14)
我不确定我是否完全理解了这个问题但是,如果你需要在worker函数中使用V
对象,那么你肯定应该将它作为参数传递,否则该方法实际上不是自包含的:< / p>
def worker(V, element):
element *= V.value
现在为了在地图函数中使用它,你需要使用partial,这样map只能看到1参数函数:
from functools import partial
def SomeMethod(sc):
someValue = rand()
V = sc.broadcast(someValue)
A = sc.parallelize().map(partial(worker, V=V))