Scala Spark:如何组合2个已排序的RDD,以便在合并后保持顺序?
我有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 <
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真的很新,要么人们对使用它有点厌倦:(