目录
前言
本文给出了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 ■