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

Scala Spark:如何组合2个已排序的RDD,以便在合并后保持顺序?,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有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 <

我有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)
val rdd\u a=some_-pair\u rdd.sortByKey()。
zipWithIndex.filter(f=>f._2f.\u 1)
val rdd_b=另一对\u rdd.sortByKey()。
zipWithIndex.filter(f=>f._2f.\u 1)
val all_rdd=rdd_a.联合(rdd_b)

所有rdd
中,我看到顺序不一定像我想象的那样得到维护(
rdd\u a
的所有元素排在第一位,然后是
rdd\u b
的所有元素)。我的假设是否不正确(关于
union
),如果是,我应该使用什么将多个排序的rdd附加到一个rdd中?

我对Spark是相当陌生的,所以我可能是错的,但从我的理解来看,union是一个狭隘的转换。也就是说,每个执行器只将其RDD a的本地块与其RDD b的本地块连接起来,然后将其返回给驱动程序

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

RDD_A=[“A”、“b”、“c”、“d”、“e”、“f”]

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

让执行器1包含RDD的前一半,执行器2包含RDD的后一半。当他们在本地块上执行并集时,看起来像:

联合执行人1=[“a”、“b”、“c”、“1”、“2”、“3”]

联合执行人2=[“d”、“e”、“f”、“4”、“5”、“6”]

因此,当执行者将他们的零件传递回驾驶员时,您将得到[“a”、“b”、“c”、“1”、“2”、“3”、“d”、“e”、“f”、“4”、“5”、“6”]


再说一次,我是Spark的新手,我可能错了。我只是根据我对RDD如何工作的理解来分享。希望我们都能从中学到一些东西。

你不能。Spark没有合并排序,因为您不能假设RDD在节点上的实际存储方式。如果你想在取得联盟后按顺序排序,你需要重新排序。

这是第一个明确的问题,有MWE和多个特定标签,15个小时没有任何评论或回答!要么Spark真的很新,要么人们对使用它有点厌倦:(