Spark:使用Broadcast变量的正确方法是什么?

时间:2018-05-18 19:27:04

标签: scala apache-spark

我不知道我是否正在使用广播变量。

我有两个RDD,rdd1rdd2。我想应用rdd2.mapPartitionsWithIndex(...),对于每个分区,我需要使用整个rdd1进行一些计算。所以,我认为这是一个使用Broadcast变量的情况。 第一个问题: 我认为是对的吗?

为此,我这样做了:

val rdd1Broadcast =  sc.broadcast(rdd1.collect())  

第二个问题: 为什么我需要放.collect()我看到有和没有.collect()的示例,但我没有意识到我何时需要使用它。

另外,我这样做了:

val rdd3 = rdd2.mapPartitionsWithIndex( myfunction(_, _, rdd1Broadcast), preservesPartitioning = preserves).cache()

第三个问题: 哪个更好:传递rdd1Broadcastrdd1Broadcast.value

1 个答案:

答案 0 :(得分:1)

  

我认为是对的吗?

实际上没有足够的信息来回答这一部分。仅当广播对象相对较小时,广播才有用,或者本地访问会显着降低计算复杂度。

  

为什么我需要输入.collect()。

因为RDDs只能在驱动程序上访问。广播RDD没有意义,因为您无法从任务中访问数据。

  

哪个更好:传递rdd1Broadcastrdd1Broadcast.value

参数应为Broadcast[_]类型,因此请勿使用rdd1Broadcast.value。如果参数按值传递,则将在本地评估和替换参数,并且不会使用broadcast