数据框加入 Spark 可以保持顺序吗?

Posted

技术标签:

【中文标题】数据框加入 Spark 可以保持顺序吗?【英文标题】:Can Dataframe joins in Spark preserve order? 【发布时间】:2016-06-28 20:34:14 【问题描述】:

我目前正在尝试将两个 DataFrame 连接在一起,但在其中一个 DataFrame 中保留相同的顺序。

来自Which operations preserve RDD order?,似乎(如果这是不准确的,请纠正我,因为我是 Spark 的新手)连接不保留顺序,因为行被连接/“到达”在最终数据帧中,因为没有以指定的顺序数据位于不同的分区中。

如何在保留一个表的顺序的同时执行两个 DataFrame 的连接?

例如,

+------------+---------+ | col1 | col2 | +------------+---------+ | 0 | a | | 1 | b | +------------+---------+

加入

+------------+---------+ | col2 | col3 | +------------+---------+ | b | x | | a | y | +------------+---------+

关于col2应该给

+------------+--------------------+ | col1 | col2 | col 3 | +------------+---------+----------+ | 0 | a | y | | 1 | b | x | +------------+---------+----------+

我听说过一些关于使用coalescerepartition 的消息,但我不确定。感谢任何建议/方法/见解。

编辑:这是否类似于在 MapReduce 中使用一个 reducer?如果是这样,在 Spark 中会是什么样子?

【问题讨论】:

看到这个问题:***.com/questions/32882529/… 我不认为 zip 会起作用,因为表 2 中的行应该在保持顺序的同时连接到表 1 中的行,而不是第 1 行与第 1 行一起,等等,对于索引和连接的方法。 我刚刚从您上面的示例中注意到 col2 被用于连接条件。这就是你想要的吗? 是的,col2 应该是连接条件。很抱歉,如果不清楚,将编辑问题。 在这种情况下,我希望 Spark 会在结果数据框中保持顺序。因此,如果您执行a.join(b, a.col2=b.col2),则生成的数据帧应按 a 排序。数据帧的顺序只有在你在 spark 中执行 take 或 collect 时才真正重要。如果你想要一个自然的顺序,那么你总是可以对数据框进行排序。 【参考方案1】:

不能。您可以添加monotonically_increasing_id 并在加入后重新排序数据。

【讨论】:

以上是关于数据框加入 Spark 可以保持顺序吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spark数据框加入问题

我们可以在不创建模式的情况下在 spark 数据框中加载分隔的文本文件吗?

Scala Spark 循环加入数据框

spark中选择和过滤的顺序有啥偏好吗?

两个数据框的并集改变了 Spark 中的列顺序

去除ArrayList中的重复元素并保持顺序