因此我需要将一些相关内容从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()
然后广播......至少这是此时的最佳解决方案。
再次感谢!
答案 0 :(得分:1)
首先 - 您不需要遍历RDD来获取所有数据。有API - collect()
。
第二:广播与分发广告不同。
RDD按其性质分发。
第三:要获取所需内容,您可以使用RDD API或将其转换为DataFrame并使用SQL查询。这取决于您拥有的数据。无论如何,结果的内容将是RDD或DataFrame,它也将被分发。因此,如果您需要本地数据 - 您collect()
。
从您的问题来看,您无法理解您想要做什么,看起来您需要阅读Spark基础知识。这会给你很多答案:)