数据框加入 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 |
+------------+---------+----------+
我听说过一些关于使用coalesce
或repartition
的消息,但我不确定。感谢任何建议/方法/见解。
编辑:这是否类似于在 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 可以保持顺序吗?的主要内容,如果未能解决你的问题,请参考以下文章