[实时计算flink]双流JOIN语句
Flink SQL支持对动态表进行复杂而灵活的连接操作,本文为您介绍如何使用双流JOIN语句。
背景信息
实时计算的JOIN和传统批处理JOIN的语义一致,都用于将两张表关联起来。区别为实时计算关联的是两张动态表,关联的结果也会动态更新,以保证最终结果和批处理结果一致。
双流JOIN语法
tableReference [, tableReference ]*
| tableExpression [ NATURAL | INNER ] [ { LEFT | RIGHT | FULL } [ OUTER ] ] JOIN tableExpression [ joinCondition ]
| tableExpression CROSS JOIN tableExpression
| tableExpression [ CROSS | OUTER ] APPLY tableExpressionjoinCondition:
ON booleanExpression
| USING '(' column [, column ]* ')'
-
tableReference:表名称。
-
tableExpression:表达式。
-
joinCondition:JOIN条件。
双流JOIN hints
从实时计算引擎VVR 8.0.1 开始,您可以通过提示(Hints)单独为双流JOIN的左右流状态设置不同生命周期 (TTL)来减少维护的状态大小。
-
语法
-- VVR 8.0.1 开始 SELECT /*+ JOIN_STATE_TTL('tableReference1' = 'ttl1' [, 'tableReference2' = 'ttl2']*) */ ...-- VVR 8.0.7 开始,您也可以使用社区的Join State TTL Hint语法 SELECT /*+ STATE_TTL('tableReference1' = 'ttl1' [, 'tableReference2' = 'ttl2']*) */ ...
-
注意事项
-
JOIN STATE TTL HINT仅支持在双流JOIN场景使用,不支持维表JOIN、Interval Join或Window Join。
-
若双流JOIN时JOIN STATE TTL HINT仅指定某一条流的在JOIN节点的状态生命周期,则另外一条流的状态生命周期使用Flink SQL作业级别的状态生命周期,由table.exec.state.ttl控制(参见基本配置),默认值为1.5天。
-
tableReference支持表名,视图名和别名,一旦为表名指定别名时,则需使用别名。
-
这是一个实验性质的特性,HINT语法未来可能会发生变化。
-
-
示例
-- HINT使用别名 SELECT /*+ JOIN_STATE_TTL('o' = '3d', 'p' = '1d') */o.rowtime, o.productid, o.orderid, o.units, p.name, p.unitpriceFROM Orders AS oJOIN Products AS p ON o.productid = p.productid; -- VVR 8.0.7及以上版本也可以使用新语法 SELECT /*+ STATE_TTL('o' = '3d', 'p' = '1d') */o.rowtime, o.productid, o.orderid, o.units, p.name, p.unitpriceFROM Orders AS oJOIN Products AS p ON o.productid = p.productid;-- HINT使用表名 SELECT /*+ JOIN_STATE_TTL('Orders' = '3d', 'Products' = '1d') */ *FROM OrdersJOIN Products ON Orders.productid = Products.productid; -- VVR 8.0.7及以上版本也可以使用新语法 SELECT /*+ STATE_TTL('Orders' = '3d', 'Products' = '1d') */ *FROM OrdersJOIN Products ON Orders.productid = Products.productid;-- HINT使用视图名 CREATE TEMPORARY VIEW v AS SELECT id, ...FROM (SELECT id, ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ..) AS rnFROM src1WHERE ...) tmp WHERE rn = 1;SELECT /*+ JOIN_STATE_TTL('v' = '1d', 'b' = '3d') */ v.* , b.* FROM v LEFT JOIN src2 AS b ON v.id = b.id; -- VVR 8.0.7及以上版本也可以使用新语法 SELECT /*+ STATE_TTL('v' = '1d', 'b' = '3d') */ v.* , b.* FROM v LEFT JOIN src2 AS b ON v.id = b.id;
Orders JOIN Products表的数据示例
-
测试数据
表 1. Orders
rowtime
productid
orderid
units
10:17:00
30
5
4
10:17:05
10
6
1
10:18:05
20
7
2
10:18:07
30
8
20
11:02:00
10
9
6
11:04:00
10
10
1
11:09:30
40
11
12
11:24:11
10
12
4
表 2. Products
productid
name
unitprice
30
Cheese
17
10
Beer
0.25
20
Wine
6
30
Cheese
17
10
Beer
0.25
10
Beer
0.25
40
Bread
100
10
Beer
0.25
-
测试语句
SELECT o.rowtime, o.productid, o.orderid, o.units, p.name, p.unitpriceFROM Orders AS oJOIN Products AS p ON o.productid = p.productid;
-
测试结果
o.rowtime
o.productid
o.orderid
o.units
p.name
p.unitprice
10:17:00
30
5
4
Cheese
17.00
10:17:00
30
5
4
Cheese
17.00
10:17:05
10
6
1
Beer
0.25
10:17:05
10
6
1
Beer
0.25
10:17:05
10
6
1
Beer
0.25
10:17:05
10
6
1
Beer
0.25
10:18:05
20
7
2
Wine
6.00
10:18:07
30
8
20
Cheese
17.00
10:18:07
30
8
20
Cheese
17.00
11:02:00
10
9
6
Beer
0.25
11:02:00
10
9
6
Beer
0.25
11:02:00
10
9
6
Beer
0.25
11:02:00
10
9
6
Beer
0.25
11:04:00
10
10
1
Beer
0.25
11:04:00
10
10
1
Beer
0.25
11:04:00
10
10
1
Beer
0.25
11:04:00
10
10
1
Beer
0.25
11:09:30
40
11
12
Bread
100.00
11:24:11
10
12
4
Beer
0.25
11:24:11
10
12
4
Beer
0.25
11:24:11
10
12
4
Beer
0.25
11:24:11
10
12
4
Beer
0.25
datahub_stream1 JOIN datahub_stream2表的数据示例
-
测试数据
表 3. datahub_stream1
a(BIGINT)
b(BIGINT)
c(VARCHAR)
0
10
test11
1
10
test21
表 4. datahub_stream2
a(BIGINT)
b(BIGINT)
c(VARCHAR)
0
10
test11
1
10
test21
0
10
test31
1
10
test41
-
测试语句
SELECT s1.c,s2.c FROM datahub_stream1 AS s1 JOIN datahub_stream2 AS s2 ON s1.a = s2.a WHERE s1.a = 0;
-
测试结果
s1.c(VARCHAR)
s2.c(VARCHAR)
test11
test11
test11
test31
相关文章:
[实时计算flink]双流JOIN语句
Flink SQL支持对动态表进行复杂而灵活的连接操作,本文为您介绍如何使用双流JOIN语句。 背景信息 实时计算的JOIN和传统批处理JOIN的语义一致,都用于将两张表关联起来。区别为实时计算关联的是两张动态表,关联的结果也会动态更新,…...

metahuman如何导入UE5
1.启动 通过EPIC启动UE5(UE5内置有Bridge, 但是UE4是需要单独下在Bridge软件) 2.打开Quixel Bridge 在window(窗口)中打开Quixel Bridge 3.Bridge界面 在弹出的Bridge界面选择模型 需要先下载,然后再导入 4.下载模型 点击需要的模型右上方的绿色箭头下载 5.下…...
Python知识点:基于Python技术,如何使用TensorFlow进行自动驾驶模型训练
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 使用TensorFlow进行自动驾驶模型训练的Python技术详解 自动驾驶技术是人工智能领…...

Django的请求与响应
Django的请求与响应 1、常见的请求2、常见的响应3、案例 1、常见的请求 函数的参数request是一个对象,封装了用户发送过来的所有请求相关数据。 get请求一般用来请求获取数据,get请求也可以传参到后台,但是传递的参数显示在地址栏。 post请求…...
[java]Iterable<Integer> 和Iterator<Integer>的区别和用法
Iterable<Integer> 和 Iterator<Integer> 在 Java 中都是用于处理集合数据的重要接口,但它们的角色和用途有所不同。以下是它们之间的主要区别: 1. 接口角色 Iterable<T>:这是一个接口,它定义了如何获取一个…...
JavaScript进行数据可视化:D3.js入门
在数据驱动的世界中,数据可视化是理解和传达数据信息的重要手段。D3.js是一个强大的JavaScript库,它允许开发者将数据转换为可交互的图形和图表。本文将为您介绍D3.js的基本概念、特点以及如何入门使用它进行数据可视化。 D3.js简介 什么是D3.js&#…...

字符串拼接方法性能对比和分析
对字符串进行拼接主要有三种方法: 1.加号 2.concat方法 3.StringBuilder或者StringBuffer的append方法 下面看下性能对比,测试方法为各循环十万次,对比耗费时间。 测试性能 1.”"拼接 long start System.currentTimeMillis();String …...

[Halcon矩阵] 通过手眼标定矩阵计算相机旋转角度
📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…...

推荐几本编程入门书目
对于编程入门,推荐以下几本书籍,这些书籍覆盖了不同的编程语言,适合零基础的学习者逐步掌握编程基础: 1. 《Python编程快速上手——让繁琐工作自动化》 特点:以简单易懂的方式介绍了Python的基础知识和编程概念&#…...
每天一个数据分析题(五百零五)- 提升方法
提升方法(Boosting),是一种可以用来减小监督式学习中偏差的机器学习算法。基于Boosting的集成学习,其代表算法不包括? A. Adaboost B. GBDT C. XGBOOST D. 随机森林 数据分析认证考试介绍:点击进入 题…...

华为云ECS部署DR模式的LVS
1 概述 LVS是linux内核模块,用于4层的负载均衡,它有多个工作模式,例如NAT模式、DR模式。 DR模式的数据流是这样的: client ---> Director Server(即LVS服务器,带VIP) ---> Real Serve…...
如何在 Jupyter Notebook 执行和学习 SQL 语句(上)
在Jupyter Notebook中使用SQL,你可以通过以下步骤创建一个数据库并连接到该数据库: 1. 安装SQLite和SQLAlchemy SQLite 是一个轻量级的数据库系统,适合本地小型项目。SQLAlchemy 是一个强大的数据库连接工具,可以在Jupyter中方便…...

数据结构-5.7.二叉树的层次遍历
一.演示: 1.初始化队列: 2.根结点入队: 3.判断队列是否为空,此时有根结点,说明不为空,则队头结点即根结点出队并访问,再先进它的左结点,最后进它的右结点: 4.之后对进来…...

RISC-V知识点目录
分支预测 分支预测概述https://blog.csdn.net/zhangshangjie1/article/details/136947089?sharetypeblogdetail&sharerId136947089&sharereferPC&sharesourcezhangshangjie1&spm1011.2480.3001.8118分支指令的方向预测https://blog.csdn.net/zhangshangjie1/a…...

C++11 新特性 学习笔记
C11 新特性 | 侯捷C11学习笔记 笔者作为侯捷C11新特性课程的笔记进行记录,供自己查阅方便 文章目录 C11 新特性 | 侯捷C11学习笔记1.Variadic TemplatesC11支持函数模板的默认模板参数C11在函数模板和类模板中使用可变参数 可变参数模板1) 可变参数函数模板2) 可变…...
Go 语言中的格式化占位符
在 Go 语言中,fmt 包提供了大量的格式化占位符,用于格式化输出不同类型的数据。选择合适的占位符,可以确保输出的内容格式正确、清晰易懂。 常见的占位符: 基本类型 %v:按值的默认格式输出。适用于任何类型。%v&…...

QD1-P5 HTML 段落标签(p)换行标签(br)
本节视频 www.bilibili.com/video/BV1n64y1U7oj?p5 本节学习 HTML 标签: p标签 段落br标签 换行 一、p 标签-段落 1.1 使用 p 标签划分段落 <p>段落文本</p>示例 <!DOCTYPE html> <html><head><meta charset"…...

Django的模板语法
Django的模板语法 1、初步认识2、原理 1、初步认识 本质上:在HTML中写一些占位符,由数据对这些占位符进行替换和处理。 在views.py中用字典(键值对)的形式传参,在html文件中用两个花括号来显示单独的值 列表、元组等数…...

【在Linux世界中追寻伟大的One Piece】信号捕捉|阻塞信号
目录 1 -> 信号捕捉初识 2 -> 阻塞信号 2.1 -> 信号其他相关常见概念 2.2 -> 在内核中的表示 2.3 -> sigset_t 2.4 -> 信号集操作函数 2.5 -> sigprocmask 2.6 -> sigpending 3 -> 捕捉信号 3.1 -> 内核如何实现信号的捕捉 3.2 ->…...

信息系统运维管理方案,运维建设文档,运维平台建设方案,软件硬件中间件运维方案,信息安全管理(原件word,PPT,excel)
建设方案目录: 1、智慧运维系统建设背景 2、智慧运维系统建设目标 3、智慧运维系统建设内容 4、智慧运维系统建设技术 5、智慧运维系统建设流程 6、智慧运维系统建设收益 企业对运维管理的需求: 1、提高运维效率:降低运维成本,提高…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...