我需要在构成我的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()))
谢谢!
答案 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>
。