Spark:如何组合2个已排序的RDD,以便在联合后保留顺序?

时间:2015-11-25 17:59:22

标签: scala apache-spark rdd

我有两个已排序的RDD:

val rdd_a = some_pair_rdd.sortByKey().
                    zipWithIndex.filter(f => f._2 < n).
                    map(f => f._1)
val rdd_b = another_pair_rdd.sortByKey().
                    zipWithIndex.filter(f => f._2 < n).
                    map(f => f._1)
val all_rdd = rdd_a.union(rdd_b)

all_rdd中,我发现订单未必按照我想象的那样维护(rdd_a的所有元素首先出现,然后是rdd_b的所有元素) 。我的假设是不正确的(关于union的合同),如果是这样,我应该使用什么来将多个已排序的RDD附加到单个rdd中?

2 个答案:

答案 0 :(得分:1)

我对Spark很新,所以我可能错了,但据我所知,Union是一个狭隘的转变。也就是说,每个执行程序仅将其本地RDD a块与其本地RDD b块连接,然后将其返回给驱动程序。

例如,假设您有2个执行器和2个RDDS。

RDD_A = [“a”,“b”,“c”,“d”,“e”,“f”]

RDD_B = [“1”,“2”,“3”,“4”,“5”,“6”]

让Executor 1包含RDD的前半部分,Executor 2包含两个RDD的后半部分。当他们在本地区块上执行联合时,它看起来像是:

Union_executor1 = [“a”,“b”,“c”,“1”,“2”,“3”]

Union_executor2 = [“d”,“e”,“f”,“4”,“5”,“6”]

因此,当执行者将他们的部分传回给司机时,你会有[“a”,“b”,“c”,“1”,“2”,“3”,“d”,“e”, “F”, “4”, “5”, “6”]

同样,我是Spark的新手,我可能错了。我只是基于我对RDD如何工作的理解而分享。希望我们都可以从中学到一些东西。

答案 1 :(得分:0)

不能。 Spark没有合并排序,因为您无法假设RDD实际存储在节点上的方式。如果您希望在合并后按排序顺序对事物进行排序,则需要再次排序。