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

Should I pass the broadcast variable or broadcast.value() into my RDD[custom object]?

我有一些相当大的列表,我需要在构成我的 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()))

谢谢!

取决于您希望 self.BROADCASTED 包含的内容。我假设您已针对此示例简化了方法 foo,但正因为如此,尚不清楚 foo 的目的是什么。

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

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

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