开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:连接操作_连接类型_inner】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12098
连接操作_连接类型_inner
连接类型
1.内连接
(1)内连接就是按照条件找到两个数据集关联的数据,并且在生成的结果集中只存在能关联到的数据
crossJoin 通过 where 也实现了内连接。
根据上图,2 和 A 能连接,3 和 B 能连接,因为颜色相同,1 和 C 没有对应数据进行连接,结果集只显示能连接上的数据,这种连接方式就是内连接。
(2)SQL 语句
select * from person inner join cities on person.cityId =cities .id
(3)Dataset 操作
person . join ( right = cities ,
joinExprs = person ( "cityId" ) === cities ( "id" ),
joinType = "inner" )
.show ( )
进入代码:
@Test
def inner(): unit = {
person.join(cities,
注:在进行交叉连接时使用 crossJoin,在进行其他连接时,同一使用 join
person.col( colName = "cityId") === cities.col( colName = "id"),
/指定连接方式
joinType = "inner")
.show()
以上是第一中写法,第二种写法如下:
spark.sql( sqIText = "select p.id, p.name, c.name "+
"from person p inner join cities c")
注:在另起一行时,字符串后面要有空格,否则另起一行会出错
.show()
}
运行得到结果集:
第一个结果集没有问题
第二次执行报错,第二种方式在 inner join 之后不用进行 where,但是没写连接规则,注意一定要写连接规则。
在代码中加上 on 语句:
spark.sql( sqlText = "select p.id,p.name,c.name " +
"from person p inner join cities c on p.cityid = c.id")
.show( )
再次运行:
结果显示正常。
内连接就是只连接能连接上的内容。
发现在上图结果集中少了一行数据,根据数据集显示,
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")
用户是四个人,但 Danial 的 3 在城市集中没有对应数据,所以结果集不显示 Danial 和 shanghai。