📜  在 PySpark 中合并两个数据帧(1)

📅  最后修改于: 2023-12-03 15:23:15.753000             🧑  作者: Mango

在 PySpark 中合并两个数据帧

在 PySpark 中,数据合并是非常常见的操作。它允许我们将两个不同的数据集合并成一个,以进行更加全面和深入的数据分析和挖掘。在本文中,我们将介绍如何在 PySpark 中合并两个数据帧。

什么是 PySpark 数据帧?

PySpark 数据帧是一种基于分布式计算框架 Spark 的数据结构,具有表格的特点。数据帧包含多个命名列,每个列可以包含不同类型的数据。PySpark 数据帧结构类似于 Pandas 中的数据帧。

PySpark 数据帧合并

PySpark 提供了两种数据帧合并方式,unionAlljoin

unionAll 方法

unionAll 方法允许我们将两个数据帧合并成一个。要使用此方法,我们可以使用以下语法:

df3 = df1.unionAll(df2)

其中,df1df2 是要合并的两个数据帧,df3 是合并后的结果。

以下是一个具体的示例:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("MergeDataFrame").getOrCreate()

data1 = [("John", "Smith", 34), ("Jane", "Doe", 30), ("James", "Bond", 45)]
data2 = [("Emily", "Bronte", 25), ("Mark", "Twain", 50), ("William", "Faulkner", 40)]

df1 = spark.createDataFrame(data1, ["first_name", "last_name", "age"])
df2 = spark.createDataFrame(data2, ["first_name", "last_name", "age"])

df3 = df1.unionAll(df2)

df3.show()

输出:

+----------+---------+---+
|first_name|last_name|age|
+----------+---------+---+
|      John|    Smith| 34|
|      Jane|      Doe| 30|
|     James|     Bond| 45|
|     Emily|   Bronte| 25|
|      Mark|    Twain| 50|
|   William| Faulkner| 40|
+----------+---------+---+
join 方法

join 方法允许我们根据某个键将两个数据帧合并。在使用 join 方法时,我们需要指定两个数据帧中要进行匹配的列。 join 方法支持多种不同类型的 join,例如 inner join、left join、right join 和 outer join。

以下是一个具体的示例:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col

spark = SparkSession.builder.appName("MergeDataFrame").getOrCreate()

data1 = [("John", "Smith", 34), ("Jane", "Doe", 30), ("James", "Bond", 45)]
data2 = [("John", "Smith", "London"), ("Jane", "Doe", "New York"), ("Alice", "Wonderland", "Paris")]

df1 = spark.createDataFrame(data1, ["first_name", "last_name", "age"])
df2 = spark.createDataFrame(data2, ["first_name", "last_name", "city"])

# 使用 inner join
df3 = df1.join(df2, (df1.first_name == df2.first_name) & (df1.last_name == df2.last_name))

df3.show()

输出:

+----------+---------+---+----------+---------+-----+
|first_name|last_name|age|first_name|last_name| city|
+----------+---------+---+----------+---------+-----+
|      John|    Smith| 34|      John|    Smith|London|
|      Jane|      Doe| 30|      Jane|      Doe|   New York|
+----------+---------+---+----------+---------+-----+

以上代码中的第三个数据帧 df3 是通过将 df1df2 进行内连接来创建的,即仅返回两个数据帧中都存在的行。

总结

在 PySpark 中,我们可以通过 unionAll 方法或 join 方法将两个数据帧合并成一个。 unionAll 方法将两个数据帧堆叠在一起,而 join 方法则根据特定的列将两个数据帧合并。根据我们的需求,我们可以选择使用一个方法或另一个方法。