12

我正在尝试从 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 编写一个专门的方法,该方法是自包含的并执行我想重用的特定功能?

4

1 回答 1

19

我不确定我是否完全理解了这个问题,但是,如果您需要V工作函数中的对象,那么您绝对应该将它作为参数传递,否则该方法并不是真正独立的:

def worker(V, element):
    element *= V.value

现在为了在 map 函数中使用它,您需要使用部分函数,​​以便 map 只看到 1 个参数函数:

from functools import partial

def SomeMethod(sc):
    someValue = rand()
    V = sc.broadcast(someValue)
    A = sc.parallelize().map(partial(worker, V=V))
于 2014-11-25T14:45:28.860 回答