我有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中?
我对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如何工作的理解而分享。希望我们都可以从中学到一些东西。
你不能。 Spark没有合并排序,因为您无法假设RDD实际存储在节点上的方式。如果在获取联合后需要排序顺序,则需要再次排序。