更新RDD中的广播变量

时间:2017-03-09 11:33:02

标签: apache-spark pyspark rdd

我有这个广播的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}

1 个答案:

答案 0 :(得分:1)

当你播放时,它就像共享变量。您可以像查找值一样使用它并将其视为只读。根据我的学习,每个工作节点都将拥有该变量的本地副本,并将更新它自己的副本。这不会反映到其他工作节点,因为它们只传递给每个节点一次。

来自Learning Spark的书:

  

广播变量只是spark.broadcast.Broadcast [T]类型的对象,它包装了类型为T的值。我们可以通过调用任务中Broadcast对象的值来访问此值。使用类似BitTorrent的高效通信机制,该值仅发送到每个节点一次。

     

使用广播变量的过程很简单:1。通过在类型为T的对象上调用SparkContext.broadcast来创建Broadcast [T]。任何类型都可以工作,只要它也是Serializable。 2.使用Java中的value属性(或value()方法)访问其值。 3.变量将仅发送到每个节点一次,并且应该被视为只读(更新不会传播到其他节点)。