我们知道,在数据库中经常需要从多个数据表中读取数据,这时就可以JOIN子句,在两个或多个数据表中查询数据。
JOIN 的用法按照功能划分,可分为如下三类:
Pyspark中的join操作原理是一样的, 本节我们将编写程序来执行join操作。
上一节中,我们下载了两个数据集transactions.csv
和customers.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操作:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;
country_spend_details = customerDf.join(transactionDf,customerDf.CustomerID == transactionDf.CustomerID )
country_spend_details.show()
Inner join操作将两个数据集中CustomerID
相等的记录提取出来:
这里没有指定join方式,但默认是inner 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(左连接):获取左表中的所有记录,即使在右表没有对应匹配的记录:
RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表中的所有记录,即使左表没有对应匹配的记录:
FULL JOIN( 全连接 ) :结合了 LEFT JOIN 和 RIGHT JOIN 的结果: