连接操作_连接类型_cross | 学习笔记

简介: 快速学习连接操作_连接类型_cross

开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:连接操作_连接类型_cross】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/690/detail/12097


连接操作_连接类型_cross

 

连接就是将多个表连接到一起,通过一次查询,查询到多条数据。

如果 A join B,结果显示的是所有数据还是能连接到的列?答案是可能显示所有数据,也有可能显示能连接到的数据,故在连接是要有多重连接方式。

 

连接类型

本节课主要讲第一种连接方式——交叉连接,也叫 crossJoin,交叉连接是最简单的一种连接方式,但交叉连接的性能比较差,一般交叉连接完成之后要有过滤操作。

1.交叉连接

(1)交叉连接就是笛卡尔积,就是两个表中所有的数据两两结对

交叉连接是一个非常重的操作,在生产中,尽量不要将两个大数据集交叉连接,如果一定要交叉连接,也需要在交叉连接后进行过滤,优化器会进行优化。

image.png

在上图中,进行连接是按照相同颜色进行连接。

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 进行内连接、外连接。

运行代码得到结果集:

image.png

这锅结果集中有两个多余列,一个是 cityId,一个是 Id

通过 sql 语句得到的结果集:

image.png

注意 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。

相关文章
|
7月前
|
前端开发 vr&ar
【前端验证】被动响应型uvm_model环境搭建——以握手型ram_model为例
【前端验证】被动响应型uvm_model环境搭建——以握手型ram_model为例
|
11月前
|
弹性计算 安全 关系型数据库
介绍两种连接方式
介绍两种连接方式
137 1
|
SQL 大数据 API
连接操作_连接类型_fullouter | 学习笔记
快速学习连接操作_连接类型_fullouter
76 0
连接操作_连接类型_fullouter | 学习笔记
|
SQL 大数据 开发者
连接操作_连接类型_inner | 学习笔记
快速学习连接操作_连接类型_inner
67 0
连接操作_连接类型_inner | 学习笔记
|
SQL 大数据 开发者
连接操作_连接类型_left | 学习笔记
快速学习连接操作_连接类型_left
84 0
连接操作_连接类型_left | 学习笔记
|
SQL 大数据 开发者
连接操作_连接类型_semi&;anti | 学习笔记
快速学习连接操作_连接类型_semi&;anti
145 0
连接操作_连接类型_semi&;anti | 学习笔记
|
TensorFlow 算法框架/工具
Tensorflow |(4)名称域、图 和会话
Tensorflow |(4)名称域、图 和会话
82 0
Tensorflow |(4)名称域、图 和会话
|
算法 Java TensorFlow
Tensorflow源码解析2 -- 前后端连接的桥梁 - Session
# 1 Session概述 Session是TensorFlow前后端连接的桥梁。用户利用session使得client能够与master的执行引擎建立连接,并通过session.run()来触发一次计算。它建立了一套上下文环境,封装了operation计算以及tensor求值的环境。 session创建时,系统会分配一些资源,比如graph引用、要连接的计算引擎的名称等。故计算完毕后
2942 0
|
关系型数据库 网络安全 数据库
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.2. 连接状态函数
33.2. 连接状态函数 这些函数可以被用来询问一个已有数据库连接对象的状态。 提示 libpq应用程序员应该小心地维护PGconn抽象。使用下面描述的访问函数来理解PGconn的内容。我们不推荐使用libpq-int.h引用内部的PGconn域,因为它们可能在未来改变。
1408 0