开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:连接操作_入门_案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12096
连接操作_入门_案例
连接案例
上节介绍了什么是连接,以及什么是 join,本节课主要介绍怎样使用连接,这需要做一个案例。
在做案例的过程中,第一步是编写案例,编写案例之前要先查看数据集如何连接、编写代码、多表联查。
1.简单连接案例
表结构如下:
Id |
Name |
Cityid |
0 |
Lucy |
0 |
1 |
Lily |
0 |
2 |
Tim |
2 |
3 |
Danial |
0 |
Id |
Name |
0 |
Beijing |
1 |
Shanghai |
2 |
Guangzhou |
以上是两个表,任务是将两个表进行连接,然后在这两个表连接过的中间表中进行查询。
问题:如何连接?分析步骤如下:
①观察数据集
②找到连接点
第一个表中的 cityid 可以看做是第二个表中的 id,根据任务要求,两个表连接得到的新表应该显示人名对应的城市,所以连接点应该分为两个:第一个连接点是 cityid,第二个连接点是第二个表的 id。在进行连接时要判断第一个表 cityid 和第二个表 id 是否相等,如果相同将 id 拿进新表中。
拷贝数据集,
val person = Seq((o, "Lucy", 0),(1, "Lily", 0),(2, "Tim", 2),(3, "Danial", 0))
.toDF( colNames = "id", "name", "cityId")
val cities = Seq((0, "Beijing"), (1, "Shanghai"), (2, "Guangzhou"))
. toDF( colNames = "id", "name")
进入.idea 创建新的类,类的名称为 JoinProcessor
代码:
package cn.itcast. spark.sql
import org . apache . spark . sql . SparkSession
import org. junit.Test
class JoinProcessor {
val spark = SparkSession. builder()
. master( master = "local[6]")
. appName( name = "join")
. getorcreate()
/将隐式转换导入
import spark. implicits._
@Test
def introJoin(): Unit = {
val person = Seq((0, "Lucy", 0),(1, "Lily", 0),(2, "Tim", 2),(3, "Danial", 0))
.toDF( colNames = "id", "name", "cityId")
注:
如果要使用 toDF,要先创建一个 sparksession,创建之后将隐式转换导入。
val cities = Seq((0, "Beijing"), (1, "Shanghai"), (2, "Guangzhou"))
. toDF( colNames = "id", "name")
第一个数据集中第一列数据是 id,第二列是姓名,第三列是 cityid;第二个数据集第一列数据是 id,这个 id 就是城市 id,第二列是城市名。
/根据 cityid 和 id 两个连接点进行连接
person.join(cities, person.col( colName = "cityId") === cities.col( colName = "id"))
注:cityId 是第一个表的,必须要标注 person,要标明是哪个数据中的哪个列。
/进行 select,选择如下三列数据
.select (person.col( colName = "id"),
person.col( colName = "name"),
cities.col( colName ="name"))
.show()
}
}
运行代码之后得到结果集,如下图:
在上图结果集中不仅显示用户的主键,还显示了用户的名字以及用户的城市。
前面课程说到连接是在一个查询语句中,同时查询多条数据。
将.show()注释到,生成一个数据集为 dataframe,通过 dataframe 进行 createorPeplaceTempView,并将它命名为 user_city。
Val df = person. join(cities, person.col( colName = "cityId") === cities.col( colName = "id"))
.select (person.col( colName = "id"),
person.col( colName = "name"),
cities.col( colName = "name") as "city")
.show()
df . createorReplaceTempView( viewName = "user_ city")
进行 sql 语句查询
spark.sql( sqlText= "select id, name, city from user_ city where city = ‘Beijing’" )
注:
select 后的 city 是 cities name,只是通过 as 将名称改为 city,也就是说在 select 时可以为某一个列取一个别名。
id 和 name 来源于第一个表,city 来源于第二个表,所以这个 spark.sql 语句是作用于两个表的,所以是同时访问了多条数据。
.show()
}
再次运行:
发现 city 为 beijing 的数据显现,并且将两个表的数据都查询出了。
发现 city 为 beijing 的数据显现,并且将两个表的数据都查询出了。
以上就是多表连接。
根据下图,sql 语句是作用于连接表,而连接表又是由用户表和城市表连接而成的,所以下图的 sql 语句是作用于用户表和城市表中的。