📅  最后修改于: 2023-12-03 14:52:29.686000             🧑  作者: Mango
在PySpark中,我们可以使用多种方法来合并多个数据框,如 join()
、union()
和 merge()
等方法。在本篇文章中,我们将会介绍这些方法并提供相关示例。
我们可以使用 join()
方法来将两个数据框按照一定的条件合并起来。它的基本语法如下所示:
df3 = df1.join(df2, df1.column1 == df2.column1, "inner/outer/left/right")
其中,df1
和 df2
是要合并的两个数据框,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|
+---+----+---+
我们可以使用 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|
+---+----+
我们可以使用 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()
方法将数组分解成多行并进行分组和聚合。