Spark Join操作

我们知道,在数据库中经常需要从多个数据表中读取数据,这时就可以JOIN子句,在两个或多个数据表中查询数据。

JOIN 的用法按照功能划分,可分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;
  • LEFT JOIN(左连接):获取左表中的所有记录,即使在右表没有对应匹配的记录;
  • RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表中的所有记录,即使左表没有对应匹配的记录。
  • FULL OUTER JOIN( 全连接 ) :结合了 LEFT JOIN 和 RIGHT JOIN 的结果

Pyspark中的join操作原理是一样的, 本节我们将编写程序来执行join操作。


加载数据集

上一节中,我们下载了两个数据集transactions.csvcustomers.csv, 我们先将其加载到DataFrame并查看数据:

from pyspark.sql import SparkSession

spark = SparkSession \
       .builder \
       .appName("FirstApp") \
       .getOrCreate()

transactionDf = spark.read.csv("transactions.csv",header=True, inferSchema = True)
customerDf = spark.read.csv("customers.csv",header=True, inferSchema = True)

两个数据集有公共字段CustomerID,所以可以进行各种Join操作:

image-20220607132433857

Inner Join

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;

country_spend_details = customerDf.join(transactionDf,customerDf.CustomerID == transactionDf.CustomerID )
country_spend_details.show()

Inner join操作将两个数据集中CustomerID相等的记录提取出来:

image-20220607132556410

这里没有指定join方式,但默认是inner join。当然我们也可以显式声明:

image-20220607132657492

Left、Right、Full Join

customerDf.join(transactionDf,customerDf.CustomerID == transactionDf.CustomerID ,how="left").show()
customerDf.join(transactionDf,customerDf.CustomerID == transactionDf.CustomerID ,how="right").show()
customerDf.join(transactionDf,customerDf.CustomerID == transactionDf.CustomerID ,how="full").show()

LEFT JOIN(左连接):获取左表中的所有记录,即使在右表没有对应匹配的记录:

image-20220607132757902

RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表中的所有记录,即使左表没有对应匹配的记录:

image-20220607132827201

FULL JOIN( 全连接 ) :结合了 LEFT JOIN 和 RIGHT JOIN 的结果:

image-20220607132856020