我不知道我是否正在使用广播变量。
我有两个RDD,rdd1
和rdd2
。我想应用rdd2.mapPartitionsWithIndex(...)
,对于每个分区,我需要使用整个rdd1
进行一些计算。所以,我认为这是一个使用Broadcast变量的情况。 第一个问题: 我认为是对的吗?
为此,我这样做了:
val rdd1Broadcast = sc.broadcast(rdd1.collect())
第二个问题: 为什么我需要放.collect()
。我看到有和没有.collect()
的示例,但我没有意识到我何时需要使用它。
另外,我这样做了:
val rdd3 = rdd2.mapPartitionsWithIndex( myfunction(_, _, rdd1Broadcast), preservesPartitioning = preserves).cache()
第三个问题: 哪个更好:传递rdd1Broadcast
或rdd1Broadcast.value
?
答案 0 :(得分:1)
我认为是对的吗?
实际上没有足够的信息来回答这一部分。仅当广播对象相对较小时,广播才有用,或者本地访问会显着降低计算复杂度。
为什么我需要输入.collect()。
因为RDDs
只能在驱动程序上访问。广播RDD
没有意义,因为您无法从任务中访问数据。
哪个更好:传递
rdd1Broadcast
或rdd1Broadcast.value
?
参数应为Broadcast[_]
类型,因此请勿使用rdd1Broadcast.value
。如果参数按值传递,则将在本地评估和替换参数,并且不会使用broadcast
。