Flink sql join的4种不同类型

目录

1. UnBounded的双流JOIN:

2. 单流与UDTF的JOIN操作:

3. 单流与版本表的JOIN:

4.interval join


1. UnBounded的双流JOIN:


https://developer.aliyun.com/article/672760?spm=a2c6h.13262185.0.0.6c007e186Tt5n

是双流驱动,即任何一个流有新数据过来都会触发计算。

关联过程:左右两边的没进来一条数据,都会保存到state中,然后与另一边的state中的数据进行关联,然后输出。

sql的写法,和普通mysql表关联的sql写法是一样的,支持inner join、left/right outer join。

如下inner join场景和left join的流程图:

inner join只有关联上才会输出结果,left join则左边来了会先输出(右边没关联上就置为null,等右边来新的数据可以关联上左边的数据,则会先回撤结果,然后再新增。+代表正向记录,-代表撤回记录

2. 单流与UDTF的JOIN操作:


https://developer.aliyun.com/article/674345?spm=a2c6h.12873639.0.0.47903da5UARE9Vhttps://developer.aliyun.com/article/674345?spm=a2c6h.12873639.0.0.47903da5UARE9V

3. 单流与版本表的JOIN:

由左边的单流驱动,temporal join。左表是流,右表是temporal table

temporal table 支持FOR SYSTEM_TIME AS OF语法,

例如DDL语句

CREATE TABLE Emp
ENo INTEGER,
Sys_Start TIMESTAMP(12) GENERATED
ALWAYS AS ROW Start,
Sys_end TIMESTAMP(12) GENERATED
ALWAYS AS ROW END,
EName VARCHAR(30),
PERIOD FOR SYSTEM_TIME (Sys_Start,Sys_end)
) WITH SYSTEM VERSIONING

DML语句

INSERT INTO Emp (ENo, EName) VALUES (22217, 'Joe')

说明: 其中Sys_Start和Sys_End是数据库系统默认填充的。

例如查询:

SELECT ENo,EName,Sys_Start,Sys_End FROM Emp 
FOR SYSTEM_TIME AS OF TIMESTAMP '2011-01-02 00:00:00'
说明: 这个查询会返回所有Sys_Start <= 2011-01-02 00:00:00 并且 Sys_end > 2011-01-02 00:00:00 的记录。

https://github.com/ververica/flink-sql-cookbook/blob/main/joins/03_kafka_join/03_kafka_join.md

Apache Flink 漫谈系列(11) - Temporal Table JOIN-阿里云开发者社区


https://developer.aliyun.com/article/679659?spm=a2c6h.12873639.0.0.47903da5UARE9V

4.interval join

在UnBounded数据流上按时间维度进行数据划分进行JOIN操作 - Time Interval(Time-windowed)JOIN, 后面我们叫做Interval JOIN:
https://developer.aliyun.com/article/683681

https://github.com/ververica/flink-sql-cookbook/blob/main/joins/02_interval_joins/02_interval_joins.md

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flink SQL中的JOIN操作可以用于实时流处理,实时处理时需要使用Flink的DataStream API将数据流转换为Flink SQL中的Table,并且需要使用Flink的Table API或SQL API执行JOIN操作。 具体的实时JOIN操作步骤如下: 1. 将数据流转换为Table:使用Flink的DataStream API将实时数据流转换为Flink SQL中的Table,可以使用Flink的Table API或SQL API进行操作。例如,可以使用Table API的`fromDataStream`方法将DataStream转换为Table: ``` DataStream<Order> orderStream = ...; Table orderTable = tableEnv.fromDataStream(orderStream); ``` 2. 定义Table Schema:定义Table的结构,包括字段名和数据类型等。这可以通过Table API或SQL API进行定义,例如: ``` Table orderTable = tableEnv.fromDataStream(orderStream, "order_id, user_id, order_total"); ``` 3. 执行JOIN操作:使用Flink SQL中的JOIN操作对Table进行JOIN操作,可以使用Table API或SQL API进行操作。例如,可以使用SQL API的`SELECT`语句进行JOIN操作: ``` String joinSql = "SELECT o.order_id, o.order_total, u.user_name " + "FROM Orders o " + "LEFT JOIN Users u ON o.user_id = u.user_id"; Table joinResult = tableEnv.sqlQuery(joinSql); ``` 4. 输出结果:将JOIN操作后的结果输出到指定的目标位置,可以使用Flink的DataStream API将Table转换为DataStream,并输出到Kafka、MySQL等数据源。 ``` DataStream<Row> joinStream = tableEnv.toAppendStream(joinResult, Row.class); joinStream.addSink(...); ``` 总的来说,Flink SQL中的JOIN操作可以用于实时流处理,可以快速地将多个数据流进行JOIN操作,并输出到指定的目标位置。使用Flink SQL进行实时JOIN操作,可以大大简化代码编写和维护的工作,提高数据处理的效率和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值