当前位置: 首页 > 知识库问答 >
问题:

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

宰父俊民
2023-03-14

我有两个分类的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中?

共有2个答案

海灵均
2023-03-14

您不能。Spark没有合并排序,因为您不能对RDD实际存储在节点上的方式做出假设。如果您希望在合并后按排序顺序进行排序,您需要重新排序。

李利
2023-03-14

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

例如,假设您有两个执行者和两个RDD。

RDD_A=["a","b","c","d","e","f"]

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

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

联合执行人1=[“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的理解来分享。希望我们都能从中学习一些东西。

 类似资料:
  • 问题是== 将nums1和nums2合并到一个按非递减顺序排序的数组中。 最终排序的数组不应由函数返回,而应存储在数组 nums1 中。为了适应这种情况,nums1 的长度为 m n,其中前 m 个元素表示应合并的元素,最后 n 个元素设置为 0 并应忽略。nums2 的长度为 n。 我的代码中有什么错误??? 您的意见 我的产出 预期产出

  • 我有三个排序数组,如下所示 这些数组根据数组中每个对象的名称属性进行排序。下面是我从Java转换为合并两个排序数组的方法 这里是两个数组的工作小提琴http://jsfiddle.net/euRn5/.什么是最好的方法来实现相同的n个数组,我目前的想法是一个接一个,合并它与以前合并到最后项目,像n=i的东西。这是最好的方法吗?

  • 我正在尝试使用 json 对象的 s3api cli 为 aws 放置对象标记创建“TagSet”。我已经将 json 解析为哈希,这是我实现最终目标的最大成功。 示例 JSON: 结束目标示例: 到目前为止,我已经将 json 解析为哈希,然后使用以下方法将键和值拆分为 2 个数组: 我想我可以遍历每个数组,然后将它们插入到一个数组中。但是我得到的输出是一个递归列表,其中包含了每个值重复出现的所

  • 我在一次编码竞赛中遇到了以下问题。我试了很多,但是一个私人测试用例总是因为错误的答案而失败,我无法弄清楚为什么我的以下方法会失败。我没有简单的解决方案来生成压力测试用例并进行比较。此外,也不会发表社论。所以,如果可能的话,我正在寻找一个人来指出我方法中的缺陷。 下面是对问题的详细描述,以及我迄今为止所做的尝试。 问题:有多个区域,您将根据每个区域的学生在各自区域中的排名获得分数。例如: 在上述数据

  • 我有一个结构数组 我希望合并并按升序排序数组。然而,当我执行合并时,没有任何变化。这是我用来创建struct数组的代码,以及MergeSort的函数调用。最大用户数是我从二叉树中转换节点数得到的整数,它应该是数组的最大数量。 任何提示或提示都将不胜感激! 编辑:当我尝试编写一些printf语句时,我注意到这些值是负数。但是存储在结构中的值是正数。这个错误的原因是什么?

  • 问题内容: 这是在采访中问我的,这是我提供的解决方案: 有没有更有效的方法可以做到这一点? 编辑:更正的长度方法。 问题答案: 稍有改进,但是在主循环之后,当到达另一个输入数组的末尾时,可以用来复制其中一个输入数组的结尾。但是,那不会改变你解决方案的性能特征。