PySpark系列:df.join的使用

PySpark系列:df.join的使用

目录

  • PySpark系列:df.join的使用
    • 前言
    • 1. 函数参数
    • 2. 函数使用
      • 2.1 inner
      • 2.2 full,outer,fullouter
      • 2.3 left,left_outer
      • 2.4 right,right_outer
      • 2.5 leftsemi
      • 2.6 leftanti

前言

本文给出了df.join的使用方法和示例,同时也给出了对应的SQL join代码;
在分辨每个join类型时,和full做对比,可以理解的更深刻。

1. 函数参数

在PySpark中,df.join将两个表结合起来,其函数如下:

join(other, on=None, how=None)

参数:

  • other:要join的Dataframe
  • on:join的条件
  • how:join的类型,支持 inner, outer, left_outer, right_outer, leftsemi,默认为inner

作用如下:

how 作用
inner,cross 如果表中有至少一个匹配,则返回行,求交集
full,outer,fullouter 只要其中一个表中存在匹配,则返回行
left,leftouter 即使右表中没有匹配,也从左表返回所有的行
right,rightouter 即使左表中没有匹配,也从右表返回所有的行
leftsemi 如果表中有至少一个匹配,则返回左表的行;等价于先inner,再取左表的字段
leftanti 左表有的,但右表不存在的;等价于先full,再取右表字段值为null的左表的字段

2. 函数使用

先建立两个DataFrame

from pyspark.sql import SparkSession
spark=SparkSession.builder.appName("wrs_202107202123").enableHiveSupport().getOrCreate()
d1 = {'name1':["赵四","刘能","广坤","浩哥","大鹏"], 'height':[165,170,160,175,180]}
d2 = {'name2':["赵四","刘能","广坤","浩哥"], 'age':[45,43,50,28]}
df1 = spark.createDataFrame(pd.DataFrame(d1))
df2 = spark.createDataFrame(pd.DataFrame(d2))
>>> df1.show():
+-----+------+
|name1|height|
+-----+------+
| 赵四|   165|
| 刘能|   170|
| 广坤|   160|
| 浩哥|   175|
| 大鹏|   180|
+-----+------+

>>> df2.show():
+-----+---+
|name2|age|
+-----+---+
| 赵四| 45|
| 刘能| 43|
| 广坤| 50|
| 浩哥| 28|
+-----+---+

2.1 inner

  • 如果表中有至少一个匹配,则返回行

spark代码:

cond = [df1.name1==df2.name2]
df_join = df1.join(df2, on=cond, how="inner")
df_join.show()
## 输出------------------------------------------------
# 可根据需要选择想要的列
+-----+------+-----+---+
|name1|height|name2|age|
+-----+------+-----+---+
|  刘能|   170|  刘能| 43|
|  广坤|   160|  广坤| 50|
|  浩哥|   175|  浩哥| 28|
|  赵四|   165|  赵四| 45|
+-----+------+-----+---+

使用SQL前,我们需要创建df的局部临时视图(local temporary view),这种视图可以直接用SQL来操作。后续我们将会省略这个步骤。

# 创建局部临时视图 
df1.createOrReplaceTempView("table1")
df2.createOrReplaceTempView("table2")

SQL代码:

select table1.name1, table1.height, table2.age
from table1, table2
where table1.name1=table2.name2

SQL JOIN代码:

select table1.name1, table1.height, table2.age 
from table1 
inner join table2 
on table1.name1=table2.name2

2.2 full,outer,fullouter

  • 返回两个表中所有行,没有匹配的行的表字段值用null填充
    spark代码:
cond = [df1.name1==df2.name2]
df_join = df1.join(df2, on=cond, how="full")
df_join.show()
## 输出------------------------------------------------
# 可根据需要选择想要的列
+-----+------+-----+----+
|name1|height|name2| age|
+-----+------+-----+----+
|  刘能|   170|  刘能|  43|
|  大鹏|   180| null|null|
|  广坤|   160|  广坤|  50|
| null|  null|  本山|  61|
|  浩哥|   175|  浩哥|  28|
|  赵四|   165|  赵四|  45|
+-----+------+-----+----+

SQL JOIN代码:

select *
from table1 
full join table2 
on table1.name1=table2.name2

2.3 left,left_outer

spark代码:

cond = [df1.name1==df2.name2]
df_join = df1.join(df2, on=cond, how="left")
df_join.show()
## 输出------------------------------------------------
# 可根据需要选择想要的列
+-----+------+-----+----+
|name1|height|name2| age|
+-----+------+-----+----+
|  刘能|   170|  刘能|  43|
|  大鹏|   180| null|null|
|  广坤|   160|  广坤|  50|
|  浩哥|   175|  浩哥|  28|
|  赵四|   165|  赵四|  45|
+-----+------+-----+----+

SQL JOIN代码:

select *
from table1 
left join table2 
on table1.name1=table2.name2

2.4 right,right_outer

spark代码:

cond = [df1.name1==df2.name2]
df_join = df1.join(df2, on=cond, how="right")
df_join.show()
## 输出------------------------------------------------
# 可根据需要选择想要的列
+-----+------+-----+---+
|name1|height|name2|age|
+-----+------+-----+---+
|  刘能|   170|  刘能| 43|
|  广坤|   160|  广坤| 50|
| null|  null|  本山| 61|
|  浩哥|   175|  浩哥| 28|
|  赵四|   165|  赵四| 45|
+-----+------+-----+---+

SQL JOIN代码:

select *
from table1 
right join table2 
on table1.name1=table2.name2

2.5 leftsemi

spark代码:

cond = [df1.name1==df2.name2]
df_join = df1.join(df2, on=cond, how="leftsemi")
df_join.show()
## 输出------------------------------------------------
# 可根据需要选择想要的列
+-----+------+
|name1|height|
+-----+------+
|  刘能|   170|
|  广坤|   160|
|  浩哥|   175|
|  赵四|   165|
+-----+------+

SQL JOIN代码:

select *
from table1 
left semi join table2 
on table1.name1=table2.name2

2.6 leftanti

spark代码:

cond = [df1.name1==df2.name2]
df_join = df1.join(df2, on=cond, how="leftanti")
df_join.show()
## 输出------------------------------------------------
# 可根据需要选择想要的列
+-----+------+
|name1|height|
+-----+------+
|  大鹏|   180|
+-----+------+

SQL JOIN代码:

select *
from table1 
left anti join table2 
on table1.name1=table2.name2

完!

你可能感兴趣的:(专栏01-PySpark使用,spark,sql)