当前位置: 首页 > news >正文

[实时计算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的语义一致,都用于将两张表关联起来。区别为实时计算关联的是两张动态表,关联的结果也会动态更新&#xff0c…...

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 中都是用于处理集合数据的重要接口&#xff0c;但它们的角色和用途有所不同。以下是它们之间的主要区别&#xff1a; 1. 接口角色 Iterable<T>&#xff1a;这是一个接口&#xff0c;它定义了如何获取一个…...

JavaScript进行数据可视化:D3.js入门

在数据驱动的世界中&#xff0c;数据可视化是理解和传达数据信息的重要手段。D3.js是一个强大的JavaScript库&#xff0c;它允许开发者将数据转换为可交互的图形和图表。本文将为您介绍D3.js的基本概念、特点以及如何入门使用它进行数据可视化。 D3.js简介 什么是D3.js&#…...

字符串拼接方法性能对比和分析

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

[Halcon矩阵] 通过手眼标定矩阵计算相机旋转角度

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…...

推荐几本编程入门书目

对于编程入门&#xff0c;推荐以下几本书籍&#xff0c;这些书籍覆盖了不同的编程语言&#xff0c;适合零基础的学习者逐步掌握编程基础&#xff1a; 1. 《Python编程快速上手——让繁琐工作自动化》 特点&#xff1a;以简单易懂的方式介绍了Python的基础知识和编程概念&#…...

每天一个数据分析题(五百零五)- 提升方法

提升方法&#xff08;Boosting&#xff09;&#xff0c;是一种可以用来减小监督式学习中偏差的机器学习算法。基于Boosting的集成学习&#xff0c;其代表算法不包括&#xff1f; A. Adaboost B. GBDT C. XGBOOST D. 随机森林 数据分析认证考试介绍&#xff1a;点击进入 题…...

华为云ECS部署DR模式的LVS

1 概述 LVS是linux内核模块&#xff0c;用于4层的负载均衡&#xff0c;它有多个工作模式&#xff0c;例如NAT模式、DR模式。 DR模式的数据流是这样的&#xff1a; client ---> Director Server&#xff08;即LVS服务器&#xff0c;带VIP&#xff09; ---> Real Serve…...

如何在 Jupyter Notebook 执行和学习 SQL 语句(上)

在Jupyter Notebook中使用SQL&#xff0c;你可以通过以下步骤创建一个数据库并连接到该数据库&#xff1a; 1. 安装SQLite和SQLAlchemy SQLite 是一个轻量级的数据库系统&#xff0c;适合本地小型项目。SQLAlchemy 是一个强大的数据库连接工具&#xff0c;可以在Jupyter中方便…...

数据结构-5.7.二叉树的层次遍历

一.演示&#xff1a; 1.初始化队列&#xff1a; 2.根结点入队&#xff1a; 3.判断队列是否为空&#xff0c;此时有根结点&#xff0c;说明不为空&#xff0c;则队头结点即根结点出队并访问&#xff0c;再先进它的左结点&#xff0c;最后进它的右结点&#xff1a; 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新特性课程的笔记进行记录&#xff0c;供自己查阅方便 文章目录 C11 新特性 | 侯捷C11学习笔记1.Variadic TemplatesC11支持函数模板的默认模板参数C11在函数模板和类模板中使用可变参数 可变参数模板1) 可变参数函数模板2) 可变…...

Go 语言中的格式化占位符

在 Go 语言中&#xff0c;fmt 包提供了大量的格式化占位符&#xff0c;用于格式化输出不同类型的数据。选择合适的占位符&#xff0c;可以确保输出的内容格式正确、清晰易懂。 常见的占位符&#xff1a; 基本类型 %v&#xff1a;按值的默认格式输出。适用于任何类型。%v&…...

QD1-P5 HTML 段落标签(p)换行标签(br)

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

Django的模板语法

Django的模板语法 1、初步认识2、原理 1、初步认识 本质上&#xff1a;在HTML中写一些占位符&#xff0c;由数据对这些占位符进行替换和处理。 在views.py中用字典&#xff08;键值对&#xff09;的形式传参&#xff0c;在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)

建设方案目录&#xff1a; 1、智慧运维系统建设背景 2、智慧运维系统建设目标 3、智慧运维系统建设内容 4、智慧运维系统建设技术 5、智慧运维系统建设流程 6、智慧运维系统建设收益 企业对运维管理的需求&#xff1a; 1、提高运维效率&#xff1a;降低运维成本&#xff0c;提高…...

多元统计实验报告内容

1 实验内容 实验目的: 利用R软件进行一些简单的数学运算,通过对简单统计量函数的操作了解R语言的基本操作过程,从而对R语言形成初步的认识。 实验项目名称: R语言软件的安装。R语言中赋值语句的练习。 在R中<-表示赋值,c()表示数组,X1<-c()即表示将一组数据赋…...

使用机器学习边缘设备的快速目标检测

论文标题&#xff1a;Fast Object Detection with a Machine Learning Edge Device 中文标题&#xff1a;使用机器学习边缘设备的快速目标检测 作者信息&#xff1a; Richard C. Rodriguez, MSDA Information Systems and Cyber Security Department, The University of Tex…...

Anthropic的CEO达里奥·阿莫迪(Dario Amodei)文章传达他对AI未来的乐观展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Human-M3 多模态姿态估计数据集-初步解读

文章概述(个人总结):该论文重点提出一个用于人体姿态估计的RGB+点云数据集,针对该多模态数据集,作者阐述了数据集的收集、数据标注以及该数据集的特点。并提出了一个简单的多模态3D人体姿态估计算法,对比其他模型,该方法性能较好。最后总结了该数据集和该方法的限制。 …...

python爬虫 - 进阶正则表达式

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配中文 &#xff08;一&#xff09;匹配单个中文字符 &#xff08;二…...

静态路由和nqa 联动实验

nqa 配置 1 test 断端口 很明显是切换到备机上了...

golang用any类型去接收前端传的数字类型的值,类型断言为float64

在 Go 中&#xff0c;使用 any 类型接收前端传来的数字时&#xff0c;通常会发现其被类型断言为 float64。这是因为在 JSON 解码的过程中&#xff0c;Go 的 encoding/json 包会将数字解析为 float64。但如果你在结构体中指明字段为 int 类型&#xff0c;框架会根据字段类型进行…...

5、Spring Boot 3.x 集成 RabbitMQ

一、前言 本篇主要是围绕着 Spring Boot 3.x 与 RabbitMQ 的集成&#xff0c;这边文章比较简单&#xff0c;RabbitMQ 的集成没有太大的变化&#xff0c;这篇文章主要是为了后续的 RabbitMQ 的动态配置做铺垫。 1、Docker 安装 RabbitMQ 2、Spring Boot 3.x 集成 RabbitMQ二、D…...

ENSP搭建基础网络拓扑图

一、ENSP的基本操作 1、配置网关 进入系统视图与退出 <Huawei>system-view [Huawei]quit 进入G0/0/0接口后配置ip [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24查询所有接口的ip配置 [R1]display ip interface brief…...

尚硅谷rabbitmq 2024 消息可靠性答疑二 第22节

returnedMessage()只有失败才调用&#xff0c;confirm()成功失败了都会调用&#xff0c;为什么&#xff1f; 在RabbitMQ中&#xff0c;消息的确认和返回机制是为了确保消息的可靠传递和处理。confirm和returnedMessage方法的调用时机和目的不同&#xff0c;因此它们的行为也有…...