开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:连接操作_连接类型_cross】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12097
连接操作_连接类型_cross
连接就是将多个表连接到一起,通过一次查询,查询到多条数据。
如果 A join B,结果显示的是所有数据还是能连接到的列?答案是可能显示所有数据,也有可能显示能连接到的数据,故在连接是要有多重连接方式。
连接类型
本节课主要讲第一种连接方式——交叉连接,也叫 crossJoin,交叉连接是最简单的一种连接方式,但交叉连接的性能比较差,一般交叉连接完成之后要有过滤操作。
1.交叉连接
(1)交叉连接就是笛卡尔积,就是两个表中所有的数据两两结对
交叉连接是一个非常重的操作,在生产中,尽量不要将两个大数据集交叉连接,如果一定要交叉连接,也需要在交叉连接后进行过滤,优化器会进行优化。
在上图中,进行连接是按照相同颜色进行连接。
crossJoin 生成的结果集是全连接,就是所有连接情况都包含。
根据上图的结果集说明:连接方式是交叉连接,求得的是一个笛卡尔积。
这种连接方式会将所有能连接的可能性罗列出来,不在乎两条数据是否能连接上。
(2)SQL 语句:select * from person,cities
select * from person cross join cities
(3)Dataset 操作
person .cross Join (cities )
.where(person. col( ""cityId" ) === cities.col( "id" ) )
.show ()
接下来分别使用以上方式进行 crossJoin
复制以下数据集,
val person = Seq((0,"Lucy",0),(1,"Lily",0),(2,“Tim",2),(3,“Danial",3))
.toDF( "id"", "name" , "cityId")
person .createOrReplaceTempView ( "person" )
val cities = Seq((0,"Beijing" ),(1,"Shanghai" ),(2,"Guangzhou"))
.toDF( "id" , "name" )
cities .createOrReplaceTempView ( "cities")
将数据集放在所有方法的外部
class joinProcessor {
val spark = sparksession.builder()
.master( master = "loca1[6]")
.appName( name = "join")
.getorcreate()
import spark. implicits._
private val person = Seq((0,"Lucy",0),(1,"Lily",0),(2,“Tim",2),(3,“Danial",3))
.toDF( "id"", "name" , "cityId")
person .createOrReplaceTempView ( "person" )
private val cities = Seq((0,"Beijing" ),(1,"Shanghai" ),(2,"Guangzhou"))
.toDF( "id" , "name" )
cities .createOrReplaceTempView ( "cities")
编写代码:
@Test
def crossoin() : unit = {
person.crossJoin(cities)
.where(person.col( colName = "cityId") === cities.col( colName = "id"))
注:crossJoin 会将所有有可能连接的结果都列出来,所以非常消耗性能和内存,如果不能进行 where,就不要使用 crossJoin。
Where 在 crossJoin 之后是没问题的,SparkSQL 命令式的 API 是经过优化的,会将 where 进行提前。
.show()
//使用 SQL 语句进行表达
spark.sql( sqlText = "select u.id,u.name,c.name from user u cross join cities c"+"where u.cityId = c.id")
.show()
}
crossJoin 是功能最强大的连接方式,因为它将所有有可能连接上的结果都列举出来,还可以通过 where 进行内连接、外连接。
运行代码得到结果集:
这锅结果集中有两个多余列,一个是 cityId,一个是 Id
通过 sql 语句得到的结果集:
注意 spark.sql( sqlText = "select u.id,u.name,c.name from user u cross join cities c"+"where u.cityId = c.id")
处写的是 user,但是在运行时改成了 person,创建的用户的邻表是 person。