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