如何将两列合并到一个新的 DataFrame 中?

Posted

技术标签:

【中文标题】如何将两列合并到一个新的 DataFrame 中?【英文标题】:How to merge two columns into a new DataFrame? 【发布时间】:2017-11-24 21:00:28 【问题描述】:

我有两个 DataFrame(Spark 2.2.0 和 Scala 2.11.8)。第一个 DataFrame df1 有一个名为 col1 的列,第二个 df2 也有一个名为 col2 的列。两个 DataFrame 中的行数相等。

如何将这两列合并到一个新的 DataFrame 中?

我试过join,但我认为应该有其他方法可以做到这一点。

另外,我尝试申请withColumm,但它没有编译。

val result = df1.withColumn(col("col2"), df2.col1)

更新:

例如:

df1 = 
col1
1
2
3

df2 = 
col2
4
5
6

result = 
col1  col2
1     4
2     5
3     6

【问题讨论】:

你是如何加入他们的? “合并”是什么意思 您想从df1 中取出第一行并将其与df2 的第一行“合并”,以此类推df1 中的每一行吗? @JacekLaskowski:是的,没错。我想得到一个有两列的 DataFrame。但实际上我不能使用join,因为没有加入标准。我只想将来自两个不同 DataFrame 的两列放在新的 DataFrame 中。 @Mike:请看我的更新。 【参考方案1】:

如果这两列之间没有实际关系,听起来你需要联合运算符,它将返回,嗯,只是这两个数据帧的联合:

var df1 = Seq("a", "b", "c").toDF("one")
var df2 = Seq("d", "e", "f").toDF("two")

df1.union(df2).show

+---+ 
|one| 
+---+ 
| a | 
| b | 
| c | 
| d | 
| e | 
| f | 
+---+

[编辑] 现在您已经明确表示您只需要两列,然后使用 DataFrames,您可以使用函数 monotonically_increasing_id() 添加行索引并加入该索引值的技巧:

import org.apache.spark.sql.functions.monotonically_increasing_id

var df1 = Seq("a", "b", "c").toDF("one")
var df2 = Seq("d", "e", "f").toDF("two")

df1.withColumn("id", monotonically_increasing_id())
    .join(df2.withColumn("id", monotonically_increasing_id()), Seq("id"))
    .drop("id")
    .show

+---+---+ 
|one|two|
+---+---+ 
| a | d | 
| b | e | 
| c | f |
+---+---+

【讨论】:

我需要列彼此相邻。所以,我需要两列,而不是一列。 我应该导入monotonically_increasing_id吗? 哦,是的,你需要导入它 您能否在回答中添加import 声明?我找不到monotonically_increasing_idimport 路径。 添加了导入。如果您最终使用该解决方案,请记住接受答案!【参考方案2】:

据我所知,想要使用 DataFrames 的唯一方法是使用 RDD.zipWithIndex 向每个索引列添加一个索引列,然后在索引列上进行连接。在 this SO answer 中可以找到在 DataFrame 上执行 zipWithIndex 的代码。

但是,如果 DataFrame 很小,将驱动程序中的两个 DF collect zip 放在一起,并将结果变成一个新的 DataFrame 会简单得多。

[使用驱动程序内收集/压缩示例更新]

val df3 = spark.createDataFrame(df1.collect() zip df2.collect()).withColumnRenamed("_1", "col1").withColumnRenamed("_2", "col2")

【讨论】:

是的,DataFrame 确实非常小。如何按照您在第二段中的建议将它们压缩在一起? 我在驱动程序中添加了一个收集和压缩的示例。【参考方案3】:

取决于你想做什么。

如果你想合并两个 DataFrame,你应该使用 join。在关系代数(或任何 DBMS)中存在相同的连接类型

您是说您的数据框每个只有一列。

在这种情况下,您可能想要进行交叉连接(笛卡尔积),并为您提供 col1 和 col2 的所有可能组合的两列表,或者您可能希望 uniao(由 @Chondrops 引用)女巫给您一个一个包含所有元素的表格。

我认为所有其他连接类型的使用都可以在 spark 中完成专门的操作(在这种情况下,两个数据框各一列)。

【讨论】:

以上是关于如何将两列合并到一个新的 DataFrame 中?的主要内容,如果未能解决你的问题,请参考以下文章

怎么将两列数据合并

如何像蜂巢中的地图一样将两列合并为一列?

熊猫将两列与空值结合起来

将日期列和时间列合并到日期时间

Java GridLayout 如何将两列合并为一列?

SQL Server,如何将两列合并为一列?