PySpark join的使用(附SQL代码)

前言

本文给出了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即使右表中没有匹配,也从左表返回所有的行。相当于先full,再删除左表字段为空的行
right,rightouter即使左表中没有匹配,也从右表返回所有的行, 相当于先full,再删除右表字段为空的行
leftsemi等价于先inner,再取左表的字段
leftanti等价于先full,再取右表字段值为null的 左表的字段

2. 函数使用

先建立两个DataFrame

d1 = {'name1':["赵四","刘能","广坤","大鹏"], 'height':[165,170,160,175]}
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|
+-----+------+

>>> 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|
|   赵四|   165|   赵四| 45|
+-----+------+-----+---+

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

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

SQL JOIN代码:

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

SQL代码:

--这个代码没有使用join关键字来实现join
select table1.name1, table1.height, table2.age
from table1, table2
where 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|
|   大鹏|   175| null|null|
|   广坤|   160|   广坤|  50|
| null|  null|   浩哥|  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|
|   大鹏|   175| null|null|
|   广坤|   160|   广坤|  50|
|   赵四|   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|   浩哥| 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|
|   赵四|   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|
+-----+------+
|   大鹏|   175|
+-----+------+

SQL JOIN代码:

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

■ \blacksquare

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值