假设我有一个自定义Spark分区程序,要操作,需要一个固定的,非常大的集合,在此示例中传递给它的构造函数。 getPartition
方法使用此集合返回分区号。
我正在考虑将集合包装在Broadcast
变量中,并将Broadcast
传递给我的自定义分区构造函数。是否可以在传递给Broadcast
和map
等RDD方法的典型函数之外使用filter
?在这种情况下,它的行为是否明确定义?是否保证变量在工作节点JVM之间有效传输和共享?
与让Spark以标准方式捕获集合相比,它是否有任何意义或者它没有改进任何东西?
答案 0 :(得分:2)
是的,可以使用Paritioner
中的广播变量。但是,如果不重复使用Partitioner
,广播的价值可能会很小。
无论如何,这里没有正确性问题。
答案 1 :(得分:0)
我自己也验证了这种可能性,Broadcast
机制也在传递给map
,filter
和其他RDD
方法的函数之外工作。从日志中可以清楚地看到广播机制的工作原理,在这种情况下,Partitioner
的行为符合预期。
但是,我认为这是一种矫枉过正(对于我的情况),除非广播对象在多个地方重复使用,否则无法提供帮助。