Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何在spark中合并两个预排序的RDD?_Sorting_Apache Spark_Rdd - Fatal编程技术网

Sorting 如何在spark中合并两个预排序的RDD?

Sorting 如何在spark中合并两个预排序的RDD?,sorting,apache-spark,rdd,Sorting,Apache Spark,Rdd,我有两个大的csv文件,由其中一列预先排序。有没有一种方法可以利用它们已经被排序的事实来更快地获得新的已排序RDD,而无需再次进行完全排序?简短的回答:没有,在使用Apache Spark提供的排序功能时,无法利用两个输入RDD已经被排序的事实 答案很长:在某些情况下,可能有比使用sortBy或sortByKey更好的方法 最明显的情况是,输入RDD已经排序并表示不同的范围。在这种情况下,简单地使用rdd1.union(rdd2)是组合输入rdd的最快(几乎为零成本)方法,假设rdd1中的所有元

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

简短的回答:没有,在使用Apache Spark提供的排序功能时,无法利用两个输入RDD已经被排序的事实

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

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

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

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

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

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

如果您有兴趣了解ApacheSpark使用的洗牌逻辑的更多信息,这里有一篇文章解释基本概念