我应该将广播变量或broadcast.value()传递到我的RDD [自定义对象]吗?

时间:2016-06-07 18:34:27

标签: python apache-spark pyspark broadcast

我需要在构成我的RDD的每个对象中访问一些相当大的列表。所以在我广播这些列表后,我应该将广播变量或broadcast.value()传入每个对象吗?我不希望为每个对象复制列表,但是每个对象都能够使用列表。我的代码看起来像这样:

class foo(object):
    def __init__(self, number, broadcasted)
        self.NUMBER = number
        self.BROADCASTED = broadcasted

broadcasted_list = sc.broadcast([a, b, c, ...])

所以我应该将RDD创建为

rdd = sc.parallelize([1, 2, 3]).map(lambda x: foo(x, broadcasted_list))

rdd = sc.parallelize([1, 2, 3]).map(lambda x: foo(x, broadcasted_list.value()))

谢谢!

1 个答案:

答案 0 :(得分:2)

取决于您希望self.BROADCASTED包含的内容。我假设您已为此示例简化了方法foo,但由于这一点,我不清楚foo的目的是什么。

如果您希望它包含[a,b,c,..],请执行broadcasted_list.value()

如果您希望该变量包含对广播对象的引用,请传入broadcasted_list

假设您需要列表中的值来执行进一步的计算,您可能希望使用broadcasted_list.value()。我想你会发现如果你传入broadcasted_list,你最终只会得到一个对象的引用,看起来像这样:<pyspark.broadcast.Broadcast object at 0x1f36f50>