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

问题描述 投票:3回答:2

我有2个排序的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中?

scala apache-spark rdd
2个回答
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如何工作的理解而分享。希望我们都可以从中学到一些东西。


0
投票

你不能。 Spark没有合并排序,因为您无法假设RDD实际存储在节点上的方式。如果在获取联合后需要排序顺序,则需要再次排序。

© www.soinside.com 2019 - 2024. All rights reserved.