我正在尝试从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 ###
Run Code Online (Sandbox Code Playgroud)
但是,如果我改为消除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
Run Code Online (Sandbox Code Playgroud)
如果可以的话,我宁愿不必将所有Spark逻辑放在main方法中.有没有办法从本地函数中广播变量并让它们对Spark工作者全局可见?
或者,对于这种情况,什么是一个好的设计模式 - 例如,我想专门为Spark编写一个自包含的方法,并执行我想重用的特定功能?