gpt4 book ai didi

sorting - 如何在spark中合并两个预排序的rdd?

转载 作者:行者123 更新时间:2023-12-02 16:05:35 25 4
gpt4 key购买 nike

我有两个大型 csv 文件,已按其中一列进行了预排序。有没有办法利用它们已经排序的事实来更快地获得新的排序 RDD,而无需再次完全排序?

最佳答案

简短的回答:不,在使用 Apache Spark 提供的排序工具时,无法利用两个输入 RDD 已经排序的事实。

长答案:在某些情况下,可能有比使用 sortBysortByKey 更好的方法。

最明显的情况是输入 RDD 已经排序并表示不同的范围。在这种情况下,假设 rdd1 中的所有元素都位于所有元素之前,则简单地使用 rdd1.union(rdd2) 是组合输入 RDD 的最快(几乎零成本)的方法。 rdd2 中的元素(根据所选顺序)。

当输入 RDD 的范围重叠时,事情会变得更加棘手。假设目标 RDD 只有一个分区,那么在两个 RDD 上使用 toLocalIterator 然后手动进行合并可能会更有效。如果结果必须是 RDD,则可以在自定义 RDD 类型的compute 方法中执行此操作,处理输入 RDD 并生成输出。

当输入很大并因此包含许多分区时,事情会变得更加棘手。在这种情况下,您可能还希望输出 RDD 中有多个分区。您可以使用前面提到的自定义 RDD,但创建多个分区(使用 RangePartitioner)。每个分区将覆盖不同范围的元素(在最佳情况下,这些范围将覆盖输出中大致相同大小的部分)。

棘手的部分是避免在compute内多次处理完整的输入RDD。当输入 RDD 使用 RangePartitioner 时,可以使用 OrderedRDDFunctions 中的 filterByRange 有效避免这种情况。当他们不使用RangePartitioner,但您知道分区是内部排序的并且也具有全局顺序时,您首先需要通过实际探测数据来找出这些分区覆盖的有效范围.

由于多分区情况相当复杂,我会检查定制排序是否真的比简单使用 sortBysortByKey 更快。 sortBysortByKey 的逻辑在洗牌过程(在节点之间传输数据)方面进行了高度优化。因此,在许多情况下,这些方法很可能比定制逻辑更快,即使定制逻辑可能是 O(n),而 sortBy/sortByKey 最多可以是 O(n log(n))。

如果您有兴趣了解有关 Apache Spark 使用的改组逻辑的更多信息,可以查看 article解释基本概念。

关于sorting - 如何在spark中合并两个预排序的rdd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39162275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com