开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:连接操作_连接类型_semi&;anti】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12101
连接操作_连接类型_semi&;anti
连接类型
本节课介绍最后两种连接方式,一种是 Leftsemi,一种是 Leftanti
如果有两个表,一个是员工表,一个是部门表,现在要查看已经入职但未分配部门的员工,只需要判断员工表中部门 Id 是否为空。
但有时这种方法不一定准确,异常情况:假如张三由部门 A 调到部门 B,张三档案有部门 ID 但是一个临时部门,但部门 A 已经不再关联张三。做法:进行连接,查看张三是否连上,连不上就显示出来。
集合示意图:
中间相交部分是能连接上的数据,但是要求在结果集中不显示此部分,只显示左侧未连接上的部分,这种连接是 LeftAnti
如果显示的是左侧连接上的数据,这种连接 LeftSemi
1.Leftanti
LeftAnti 是一种特殊的连接形式,和左外连接类似,但是其结果集中没有右侧的数据,只包含左边集合中没连接上的数据,如图:
2. Leftsemi
和 LeftAnti恰好相反,LeftSemi 的结果集也没有右侧集合的数据,但是只包含左侧集合中连接上的数据,如图:
LeftAnti 和 LeftSemi 的共同点:都不显示右侧数据
编写代码:
@Test
def leftAntiSemi() : unit = {
//左连接 anti
person.join(cities,
person.col( colName = "cityId" ) === cities.col( colName = "id""),
joinType = "leftanti")
.show()
/sql 语句
spark.sql( sqlText = "select p.id, p.name " +
"from person p left anti join cities c ”+
"on p.cityId = c.id" )
.show()
//右连接
person.join(cities,
person.col( colName = "cityId" ) === cities.col( colName = "id""),
joinType = "Leftsemi")
.show()
/sql 语句
spark.sql( sqlText = "select p.id, p.name " +
"from person p left semi join cities c ”+
"on p.cityId = c.id" )
.show()
}
运行代码得到结果集:
LeftAnti 结果集
显示左侧未连接上的Danial数据。
LeftSemi 结果集:
总结:
LeftAnti 是只显示左侧未连接上的数据,LeftSemi 是只显示左侧连接上的数据,共同点是都不显示右侧数据。






