本文给出了df.join的使用方法和示例,同时也给出了对应的SQL join代码;
在分辨每个join类型时,和full做对比,可以理解的更深刻。
在PySpark中,df.join将两个表结合起来,其函数如下:
join(other, on=None, how=None)
参数:
作用如下:
how | 作用 |
---|---|
inner,cross | 如果表中有至少一个匹配,则返回行,求交集 |
full,outer,fullouter | 只要其中一个表中存在匹配,则返回行 |
left,leftouter | 即使右表中没有匹配,也从左表返回所有的行 |
right,rightouter | 即使左表中没有匹配,也从右表返回所有的行 |
leftsemi | 如果表中有至少一个匹配,则返回左表的行;等价于先inner,再取左表的字段 |
leftanti | 左表有的,但右表不存在的;等价于先full,再取右表字段值为null的左表的字段 |
先建立两个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|
+-----+---+
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
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
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
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
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
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
完!