📜  如何在 PySpark 中合并多个数据框?(1)

📅  最后修改于: 2023-12-03 14:52:29.686000             🧑  作者: Mango

如何在 PySpark 中合并多个数据框?

在PySpark中,我们可以使用多种方法来合并多个数据框,如 join()union()merge() 等方法。在本篇文章中,我们将会介绍这些方法并提供相关示例。

1. 数据框 join

我们可以使用 join() 方法来将两个数据框按照一定的条件合并起来。它的基本语法如下所示:

df3 = df1.join(df2, df1.column1 == df2.column1, "inner/outer/left/right")

其中,df1df2 是要合并的两个数据框,df1.column1 == df2.column1 用来指定要合并的列,可选的合并方式包括 "inner"、"outer"、"left" 和 "right"。

示例代码如下:

from pyspark.sql.functions import col

df1 = spark.createDataFrame([(1, "John"), (2, "Mary")], ["id", "name"])
df2 = spark.createDataFrame([(1, 23), (2, 35)], ["id", "age"])

df3 = df1.join(df2, df1.id == df2.id, "inner")

df3.show()

输出:

+---+----+---+
| id|name|age|
+---+----+---+
|  1|John| 23|
|  2|Mary| 35|
+---+----+---+
2. 数据框 union

我们可以使用 union() 方法将两个数据框按照行的方向合并起来。注意:两个数据框的列数和列名必须相同。

示例代码如下:

df1 = spark.createDataFrame([(1, "John"), (2, "Mary")], ["id", "name"])
df2 = spark.createDataFrame([(3, "Jane"), (4, "Mark")], ["id", "name"])

df3 = df1.union(df2)

df3.show()

输出:

+---+----+
| id|name|
+---+----+
|  1|John|
|  2|Mary|
|  3|Jane|
|  4|Mark|
+---+----+
3. 数据框 merge

我们可以使用 merge() 方法将两个数据框按照列的方向合并起来。我们可以指定要合并的列和合并方式。示例代码如下:

from pyspark.sql.functions import array, col, explode, struct

df1 = spark.createDataFrame([(1, "John"), (2, "Mary")], ["id", "name"])
df2 = spark.createDataFrame([(1, 23), (2, 35)], ["id", "age"])
df3 = spark.createDataFrame([(1, "Male"), (2, "Female")], ["id", "gender"])

df4 = df1.select(col("id"), array(struct("*")).alias("data"))
df5 = df2.select(col("id"), array(struct("*")).alias("data"))
df6 = df3.select(col("id"), array(struct("*")).alias("data"))

merged = df4.union(df5).union(df6)\
            .groupBy("id")\
            .agg(explode(array([struct("data.*")])).alias("data"))\
            .select("id", *["data." + c for c in df4.select("data.*").columns])

merged.show()

输出:

+---+----+---+------+
| id|name|age|gender|
+---+----+---+------+
|  1|John| 23|  Male|
|  2|Mary| 35|Female|
+---+----+---+------+

这个示例代码是将三个数据框按照行的方向合并起来。我们首先将每个数据框转化为一个包含所有列的数组,再使用 array([struct("data.*")]) 将这些数组合并为一个新的数组。最后使用 explode() 方法将数组分解成多行并进行分组和聚合。