如何有效地广播RDD的内容

时间:2018-05-15 02:32:02

标签: apache-spark

因此我需要将一些相关内容从RDD广播到所有工作节点,我正在努力提高效率。

更具体地说,一些RDD是在执行过程中动态创建的,它将一些内容广播到所有工作节点,一个明显的解决方案是逐个遍历其元素,并创建一个列表/向量/ hashmap在遍历时保存所需内容,然后将此数据结构广播到集群。

这似乎不是一个好的解决方案,因为RDD可能很大并且已经分发,遍历它并根据遍历结果创建一些数组/列表将非常慢。

那么对于这种情况,什么是更好的解决方案或最佳实践?在RDD上运行SQL查询(在将其更改为dataFrame之后)以获取所需内容,然后将查询结果广播到所有工作节点是不是一个好主意?

提前感谢您的帮助!

在阅读Varslavans'之后添加以下内容。回答:

RDD是动态创建的,它具有以下内容:

[(1,1), (2,5), (3,5), (4,7), (5,1), (6,3), (7,2), (8,2), (9,3), (10,3), (11,3),  ...... ]

所以这个RDD包含键值对。我们想要的是收集价值> 1的所有对。所以将收集对(2,5),(3,5),(4,7),...。现在,一旦我们收集了所有这些对,我们就想广播它们,以便所有工作节点都有这些对。

听起来我们应该在RDD上使用collect()然后广播......至少这是此时的最佳解决方案。

再次感谢!

1 个答案:

答案 0 :(得分:1)

首先 - 您不需要遍历RDD来获取所有数据。有API - collect()

第二:广播与分发广告不同。

  • 在广播中 - 您拥有每个节点上的所有数据
  • 在分布式中 - 您在每个节点上拥有整体的不同部分

RDD按其性质分发。

第三:要获取所需内容,您可以使用RDD API或将其转换为DataFrame并使用SQL查询。这取决于您拥有的数据。无论如何,结果的内容将是RDD或DataFrame,它也将被分发。因此,如果您需要本地数据 - 您collect()

从您的问题来看,您无法理解您想要做什么,看起来您需要阅读Spark基础知识。这会给你很多答案:)