Flink SQL JOIN

news2024/12/23 9:45:13

双流JOIN(Regular Join)

在这里插入图片描述

​ Regular Join 就是大家熟知的双流 Join,语法上就是普通的 JOIN 语法。图中案例是通过广告曝光流关联广告点击流将广告数据打宽,打宽后可以进一步计算广告费用。从图中可以看出,曝光流和点击流都会存入 join 节点的 state,join 算子通过关联曝光流和点击流的 state 实现数据打宽。Regular Join 的特点是,任意一侧流都会触发结果的更新,比如案例中的曝光流和点击流。同时 Regular Join 的语法与传统批 SQL 一致,用户学习门槛低。但需要注意的是,Regular join 通过 state 来存储双流已经到达的数据,state 默认永久保留,所以 Regular join 的一个问题是默认情况下 state 会持续增长,一般我们会结合 state TTL 使用。

在这里插入图片描述

区间JOIN(Interval Join)

Interval Join 是一条流上需要有时间区间的 join,比如刚刚的广告计费案例中,它有一个非常典型的业务特点在里面,就是点击一般发生在曝光之后的 10 分钟内。因此相对于 Regular Join,我们其实只需要关联这10分钟内的曝光数据,所以 state 不用存储全量的曝光数据,它是在 Regular Join 之上的一种优化。要转成一个 Interval Join,需要在两个流上都定义时间属性字段(如图中的 click_time 和 show_time)。并在 join 条件中定义左右流的时间区间,比如这里我们增加了一个条件:点击时间需要大于等于曝光时间,同时小于等于曝光后 10 分钟。与 Regular Join 相同, Interval Join 任意一条流都会触发结果更新,但相比 Regular Join,Interval Join 最大的优点是 state 可以自动清理,根据时间区间保留数据,state 占用大幅减少。Interval Join 适用于业务有明确的时间区间,比如曝光流关联点击流,点击流关联下单流,下单流关联成交流。

在这里插入图片描述

维表JOIN(Temporal join)

Temporal join (时态表关联) 是最常用的数据打宽方式,它常用来做我们 熟 知 的 维 表 J o i n 。 在 语 法 上 , 它 需 要 一 个 显 式 的 F O R SYSTEM_TIME AS OF 语句。它与 Regular Join 以及 Interval Join 最大的区别就是,维度数据的变化不会触发结果更新,所以主流关联上的维度数据不会再改变。Flink 支持非常丰富的 Temporal join 功能,包括关联 lookup DB,关联 changelog,关联 Hive 表。在以前,大家熟知的维表 join 一般都是关联一个可以查询的数据库,因为维度数据在数据库里面,但实际上维度数据可能有多种物理形态,比如 binlog 形式,或者定期同步到 Hive 中变成了 Hive 分区表的形式。在 Flink 1.12 中,现在已经支持关联这两种新的维表形态。

Lookup DB

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OR22UIe2-1685065370914)(在这里插入图片描述
)]

Temporal Join Lookup DB 是最常见的维表 Join 方式,比如在用户点击流关联用户画像的案例中,用户点击流在 Kafka 中,用户实时画像存放在 HBase 数据库中,每个点击事件通过查询并关联 HBase 中的用户实时画像完成数据打宽。Temporal Join Lookup DB 的特点是,维表的更新不会触发结果的更新,维度数据存放在数据库中,适用于实时性要求较高的场景,使用时我们一般会开启 Async IO 和内存 cache 提升查询效率。

Changelog Stream

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7r30TYG-1685065370914)(C:\Users\ambit\AppData\Roaming\Typora\typora-user-images\image-20230313000417185.png)] 针对这类场景,Flink 1.12 支持了 Temporal Join Changelog,通过从 changelog在 Flink state 中物化出维表来实现维表关联。刚刚的场景有了更简洁的解决方案,我们可以通过 Flink CDC connector 把直播间数据库表的 changelog 同步到 Kafka 中,注意我们看下右边这段 SQL,我们用了 upsert-kafka connector 来将 MySQL binlog 写入了 Kafka,也就是 Kafka 中存放了直播间变更数据的 upsert 流。然后我们将互动数据 temporal join 这个直播间 upsert 流,便实现了直播数据打宽的功能。

​ 注意我们这里 FOR SYSTEM_TIME AS OF 不是跟一个 processing time,而是左流的 event time,它的含义是去关联这个 event time 时刻 的 直 播 间 数 据 , 同 时 我 们 在 直 播 间 u p s e r t 流 上 也 定 义 了 watermark,所以 temporal join changelog 在执行上会做 watermark 等待和对齐,保证关联上精确版本的结果,从而解决先前方案中关联不上的问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-88ZIsnqa-1685065370914)(在这里插入图片描述
)]

​ 我们详细解释下 temporal join changelog 的过程,左流是互动流数据,右流是直播间 changelog。直播间 changelog 会物化到右流的维表 state 中,state 相当于一个多版本的数据库镜像, 主流互动数据会暂时缓存在左流的 state 中,等到 watermark 到达对齐后再去查维表 state 中的数据。比如现在互动流和直播流的 watermark 都到了10:01分,互动流的这条 10:01 分评论数据就会去查询维表 state,并关联上 103 房间的信息。当 10:05 这条评论数据到来时,它不会马上输出,不然就会关联上空的房间信息。它会一直等待,等到左右两流的 watermark 都到 10:05 后,才会去关联维表 state 中的数据并输出。这个时候,它能关联上准确的 104 房间信息。

​ 总结下,Temporal Join Changelog 的特点是实时性高,因为是按照 event time 做的版本关联,所以能关联上精确版本的信息,且维表会做 watermark 对齐等待,使得用户可以通过 watermark 控制迟到的维表数。Temporal Join Changelog 中的维表数据都是存放在 temporal join 节点的 state 中,读取非常高效,就像是一个本地的 Redis 一样,用户不再需要维护额外的 Redis 组件。

Hive

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rSTwtf0M-1685065370915)(在这里插入图片描述
)]

​ 在数仓场景中,Hive 的使用是非常广泛的,Flink 与 Hive 的集成非常友好,现在已经支持 Temporal Join Hive 分区表和非分区表。我们举个典型的关联 Hive 分区表的案例:订单流关联店铺数据。店铺数据一般是变化比较缓慢的,所以业务方一般会按天全量同步店铺表到 Hive 分区中,每天会产生一个新分区,每个分区是当天全量的店铺数据。

​ 为了关联这种 Hive 数据,只需我们在创建 Hive 分区表时指定右侧这两个 红 圈 中 的 参 数 , 便 能 实 现 自 动 关 联 H i v e 最 新 分 区 功 能 ,partition.include = latestb 表示只读取 Hive 最新分区,partition name 表示选择最新分区时按分区名的字母序排序。到 10 月 3 号的时候,Hive 中已经产生了 10 月 2 号的新分区, Flink 监控到新分区后,就会重新加载10月2号的数据到 cache 中并替换掉10月1号的数据作为最新的维表。之后的订单流数据关联上的都是 cache 10 月 2 号分区的数据。Temporal join Hive 的特点是可以自动关联 Hive 最新分区,适用于维表缓慢更新,高吞吐的业务场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/571067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优雅处理HTTP请求:过滤器、拦截器、ControllerAdvice和自定义AOP

我们在开发Spring Boot应用程序时,经常会遇到需要对HTTP请求进行一些处理的情况,例如鉴权、数据校验、请求日志记录等等。在处理HTTP请求时,我们可以使用四种不同的技术来实现这些功能:过滤器、拦截器、ControllerAdvice和自定义A…

谷歌seo多久才能见效?谷歌seo见效的参考时间线和效果预估

影响谷歌SEO的效果因素 谷歌SEO的效果因多种因素而异,包括竞争程度、关键词选择、网站优化程度、内容质量和网站的历史等。一般来说,SEO是一个长期的过程,而不是一夜之间见效的事情。e6zzseo(e6zzseo的博客_CSDN博客-seo领域博主…

嵌入式音视频疑惑汇总

小小的脑袋里,大大的疑问,该文是博主在工作中遇见问题后,面向chatGPT学习的记录笔记 1.bypass hdr 是什么? “Bypass HDR” 是指绕过高动态范围(HDR)功能的一种设置。HDR 是指一种显示技术,它可以提供更高的色彩深度和亮度范围,从而产生更加真实、明亮和有层次感的图像…

Ludo:海外飞行棋游戏玩法,文末附源码

Ludo起源于印度的古老游戏Pachisi,玩法类似国内的飞行棋,是一种适合2至4人玩的战略类棋盘游戏。 其游戏规则也很简单:对局中,每人有2颗或4颗棋子,通过投骰子的方式决定前进的步数,在前进过程中赶上对手即可…

手把手带你分析 (net.devh.boot.grpc 包下面的)服务端 Grpc 自动装配、服务注册的源码(Java版)

前言 昨天写过一篇关于如何使用 Grpc 的博客,出于好奇想知道 GrpcService、GrpcClient、GrpcGlobalServerInterceptor、GrpcGlobalClientInterceptor这些注解是如何生效的,以及服务注册的流程是怎样的,就简单过了一遍源码,帮助大家…

新人必看!手把手教你如何使用浏览器表格插件(下)

摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 | 问题背景 作为一名优秀的打工人,Excel是大家上班中必不可少的办…

理解Linux TunTap设备

入门 TUN/TAP是操作系统内核中的虚拟网络设备,可以完成用户空间与内核空间的数据的交互。网络协议栈中的数据通过该设备可以进入到用户空间中,而用户空间中的程序通过该设备空间进入到内核空间的网络协议栈。 TUN模拟的是三层设备,操作三层…

chatgpt赋能python:Python主程序:提升编程效率与合作性的最佳选择

Python 主程序:提升编程效率与合作性的最佳选择 前言 Python 作为一门简单、易于学习并具备强大功能的编程语言,已经成为了最受欢迎的编程语言之一。Python 主程序不仅能够编写复杂的算法和进行数据处理,而且还可以实现广泛的应用&#xff…

基于SpringBoot+Uniapp的球队周边微信小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着微信小程序的兴起…

【jeecg-boot】jeecg-boot的一些功能扩展:

文章目录 一、Template里面将数组对象里面的值遍历>对象的key二、利用ES6的解构赋值互换数组数据:三、a-select实现可输入可下拉:四、a-table实现动态表头:五、jeecg-boot列自定义:六、jeecg-boot合计行: 一、Template里面将数…

Android 逆向工程,反编译心得

前言 apk的反编译是我们在Android开发中绕不开的一个坎,对于反编译这门技术,我们应该抱着学习的态度,学的越多,也越能防备别人反编译我们,这就是所谓的知己知彼吧,哈哈 需要准备的工具 Apktool&#xff…

centos下Harbor的安装(超详细+避坑)

前提 这篇文章讲的是在我的本地虚拟机上安装Harbor的一些过程和中途所遇到的一些问题和排除问题的情况说明;安装好的harbor的访问信息如下:http://192.168.45.146:8033/harbor(admin/Harbor12345)环境 本次所使用的环境和软件的各…

国外APP外包开发及上线流程

现在很多APP都做成全球通用版,尤其是一些小游戏类的APP,玩法全球基本都类似,在多个国家上线多个销售渠道。今天和大家分享一下Google Play上线流程及注意事项,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件…

ChatGPT:AI时代的创造力激活

《你好,ChatGPT》是一本深入探索人工智能(AI)领域的畅销书籍,它以ChatGPT为切入点,系统地介绍了AI和AIGC的基础概念、技术原理、应用领域和未来展望。这本书通俗易懂,由浅入深,层层递进&#xf…

WMS仓储管理系统解决方案能帮助电子企业解决哪些问题

WMS仓储管理系统解决方案是一种针对仓库管理的软件系统,它能够有效地解决电子企业在仓储管理方面的问题。在电子行业,由于产品的生命周期较短,且需求变化快速,WMS仓库管理系统的应用对于电子企业的管理有着重要的意义。本文将探讨…

DATAV通过配置nginx代理实现https访问

DATAV通过配置nginx代理实现https访问 首先要确保你的 datav 和 datav_proxy 的界面能用http正常访问 在nginx中添加datav配置 server {listen 8181 ssl;server_name localhost;ssl_certificate server.crt;ssl_certificate_key server.key;ssl_session_cache …

“来此加密“:轻松在线申请多域名和泛域名SSL证书

启用SSL证书是网站安全的关键。它加密数据传输,防止黑客窃听和篡改。SSL证书提升网站可信度,增加用户信任。搜索引擎更青睐启用SSL证书的网站,提高可见性和流量。此外,SSL证书还防止钓鱼和恶意软件威胁,保护用户安全。…

A-21S吸金树脂在金矿尾水、镀金废水中回收金的应用

吸金树脂Tulsimer A-21S 一、技术介绍 传统上使用活性碳吸附金子,珍贵的金会被活性碳吸附于表面,再藉由洗涤或直接焚烧以回收金。使用离子交换树脂回收贵金属比活性碳还具有多方面的优势, 因为藉由特殊制造过程中, 我们可以在其结…

python---动态类型

动态类型:是指在程序运行过程中,变量的类型可能会发生改变。 a的类型随着程序运行过程中会发生改变。 后面写不写类型是无所谓的! 相比之下静态类型的语言是更好的! 代码注释 可以使用’‘’ ‘’‘ / #来对代码进行注释

03_堆+MAT工具

堆栈方法区的关系: HotSpot是使用指针的方式来访问对象: Java堆中会存放访问类元数据的地址 reference存储的就是对象的地址 三种JVM: Sun公司的HotSpotBEA公司的JRockitIBM公司的J9 VM 一、堆体系概述 Java7之前 Heap 堆:一个…