我有两个已排序的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中?
答案 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实际存储在节点上的方式。如果您希望在合并后按排序顺序对事物进行排序,则需要再次排序。