PySpark从本地函数广播变量

时间:2014-11-16 16:27:18

标签: python apache-spark pyspark

我试图从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的方法,它是独立的并执行特定的功能我想重复使用?

1 个答案:

答案 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))