连接操作_连接类型_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。

相关文章
|
关系型数据库 MySQL 数据库
什么是内连接、外连接、交叉连接、笛卡尔积呢?
什么是内连接、外连接、交叉连接、笛卡尔积呢?
|
存储 分布式计算 大数据
MaxCompute数据类型映射
MaxCompute数据类型映射
|
3月前
|
JavaScript 前端开发 API
Vue 3:下一代前端框架革新
Vue 3:下一代前端框架革新
452 106
|
3月前
|
人工智能 搜索推荐 测试技术
人们如何使用ChatGPT
OpenAI发布《人们如何使用ChatGPT》论文,揭示截至2025年7月,周活用户超7亿,70%对话为非工作用途。三大主要场景为实用指导、信息查询与写作,其中写作是工作核心,占工作相关消息42%。用户互动以“询问”为主,占比49%,增长最快且满意度高。年轻用户(18-25岁)贡献近半消息,性别差距已缩小,女性用户过半。低收入国家增速快,高学历者更用于工作。编程仅占4.2%,情感类交流占1.9%。报告指出,ChatGPT正从生产力工具转向日常生活助手,创造广泛社会价值。
301 2
|
9月前
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全面增强
云原生应用网关进阶:阿里云网络ALB Ingress 全面增强
294 6
|
10月前
|
Java 关系型数据库 MySQL
ssm020基于ssm的人才招聘网站(文档+源码)_kaic
网络和科技的进步以及人们生活条件的提高都让计算机技术越来越平民化,深入日常生活中。网络更是成为生活的必备条件,大到国家单位、科研项目,小到大街小巷都充斥着网络的身影。在日常办公中,计算机起到了文字编辑、打印、信息检索、统计等的作用。使用计算机可以使日常繁杂的信息进行科学的加工,使信息变得更加的有序、可利用。计算机技术已成为热门。 正是因为网络、科技、计算机技术使现代人的生活和工作变得便利、轻松,给实体行业带来了巨大的冲击。人才招聘的日常工作也遇到了前所未有的挑战。现如今,对于招聘的管理有很多的局限性,究其原因是因为招聘管理的根本是信息的运动。在新时代的环境下,传统的管理方式不再满足用户的需求,
|
SQL DataWorks NoSQL
DataWorks常见问题之如何自定义日期参数
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
518 0
|
监控 NoSQL MongoDB
MongoDB性能调优:监控与诊断工具的技术探讨
【4月更文挑战第30天】本文探讨了MongoDB性能调优,重点关注监控与诊断工具。MongoDB自带的Shell和Profiler有助于理解数据库性能,而MMS、PMM和mongostat等第三方工具则提供实时监控和深度分析。调优实践包括优化索引、调整内存配置、分片与复制、硬件升级及查询优化。通过这些工具和策略,可有效提升MongoDB性能。
|
SQL 安全 数据库
|
资源调度 数据可视化 JavaScript
vue3+DataV+Echarts搭建数据大屏模板(建议收藏)
vue3+DataV+Echarts搭建数据大屏模板(建议收藏)
3002 0
vue3+DataV+Echarts搭建数据大屏模板(建议收藏)