我有这个广播的RDD。
git log | select-string limit -context 5,0
我有另一个RDD,它是一个元组列表:
test = sc.parallelize([(1),(2),(3),(4)]).zipWithIndex().map(lambda x: (x[1],x[0]))
return :
{0: 1, 1: 2, 2: 3, 3: 4}
我的目标是使用元组作为广播变量的键,并将其值更新为
因此对于元组(0,1)我的新广播变量将是。
tuples=sc.parallelize([(0,1),(1,2),(3,2)])
为元组(1,2)
{0: 2, 1: 3, 2: 3, 3: 4}
为元组(3,2)
{0: 2, 1: 4, 2: 4, 3: 4}
并返回上次更新广播变量{0: 2, 1: 4, 2: 5, 3: 5}
我尝试对其进行编码,但我的结果并不好,因为每个元组增加了一个,但没有考虑最后的结果。
{0: 2, 1: 4, 2: 5, 3: 5}
答案 0 :(得分:1)
当你播放时,它就像共享变量。您可以像查找值一样使用它并将其视为只读。根据我的学习,每个工作节点都将拥有该变量的本地副本,并将更新它自己的副本。这不会反映到其他工作节点,因为它们只传递给每个节点一次。
来自Learning Spark的书:
广播变量只是spark.broadcast.Broadcast [T]类型的对象,它包装了类型为T的值。我们可以通过调用任务中Broadcast对象的值来访问此值。使用类似BitTorrent的高效通信机制,该值仅发送到每个节点一次。
使用广播变量的过程很简单:1。通过在类型为T的对象上调用SparkContext.broadcast来创建Broadcast [T]。任何类型都可以工作,只要它也是Serializable。 2.使用Java中的value属性(或value()方法)访问其值。 3.变量将仅发送到每个节点一次,并且应该被视为只读(更新不会传播到其他节点)。