Flink Joins

一、Regular Join

二、 Interval Join

让一条流去Join另一条流中前后一段时间内的数据。底层实现是同时保留2个流一定时间,然后这样一个流既可以关联另外一个流过去一段时间范围内的数据,还能关联另外一个流未来一段时间内的数据。未来的数据是指当前时刻,还没有到的数据。要做到这一点,必须要把当前流的数据也保留起来,等另外一个流的未来的数据到了,要通知到当前这条数据去重新关联一下。

sql 复制代码
CREATE TABLE show_log_table(
    log_id      BIGINT,
    show_params STRING,
    row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
    WATERMARK FOR row_time AS row_time
) WITH (
  'connector' = 'datagen',
  'rows-per-second' = '5',
  'fields.show_params.length' = '1',
  'fields.log_id.min' = '1',
  'fields.log_id.max' = '100'
);

CREATE TABLE click_log_table(
    log_id       BIGINT,
    click_params STRING,
    row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
    WATERMARK FOR row_time AS row_time
)
WITH (
    'connector' = 'datagen',
    'rows-per-second' = '5',
    'fields.click_params.length' = '1',
    'fields.log_id.min' = '1',
    'fields.log_id.max' = '10'
);

SELECT
    show_log_table.log_id as s_id,
    show_log_table.show_params as s_params,
    click_log_table.log_id as c_id,
    click_log_table.click_params as c_param
FROM show_log_table
INNER JOIN click_log_table
ON show_log_table.log_id = click_log_table.log_id
AND show_log_table.row_time BETWEEN click_log_table.row_time - INTERVAL '5' MINUTE
AND click_log_table.row_time + INTERVAL '5' MINUTE
;

三、Temporal Join

Temporal Join在离线概念中其实是没有类似的Join概念的,但是离线中常常会维护一种表叫做拉链快照表 ,使用明细表join拉链快照表的join方式就叫做Temporal Join。而 Flink SQL中也有对应的概念,表叫做 Versioned Table, 使用明细表 join Versioned Table的join操作就叫做Temporal Join。 Temporal Join中,Versioned Table其实就是对同一条key(在DDL中以primary key标记同一个key)的历史版本(根据时间划分版本)做一个维护,当有明细表Join这个表时,可以根据明细表中的时间版本选择Versioned Table对应时间区间为的快照数据进行join。

Temporal Join应用场景:比如常见的汇率数据(实时的根据率计算总金额),在12:00之前(事件时间),人民币和美元汇率是7:1,在12:00之后变为6:1,那么在12:00之前数据就要按照7:1进行计算,12:00之后就要按照6:1计算。在事件时间语义的任务中,事件时间12:00之前的数据,要按照7:1进行计算,12:00之后的数据,要按照6:1进行计算。这其实就是离线中快照的概念,维护具体汇率的表在Flink SQL体系中就叫做Versioned Table

四、Lookup Join

Lookup Join定义(支持Batch\Streaming):Lookup Join其实就是维表Join ,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的Join就叫做维表Join

Lookup Join应用场景:小伙伴萌会问,我们既然已经有了上面介绍召的Regular Join,Interval Join等,为啥还需要一种Lookup Join?因为上面说的这几种Join都是流与流之间的Join,而Lookup Join是流与Redis,Mysql,HBase这种存储介质的Join。Lookup的意思就是实时查找,而实时的画像数据一般都是存储在Redis,MysqI,HBase中,这就是Lookup Join的由来

参考:

https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/dev/table/sql/queries/joins/#joins

【Flink】第二十三篇:join 之 temporal join
FlinkSQL 几种join

相关推荐
Hello.Reader16 小时前
Flink 状态模式演进(State Schema Evolution)从原理到落地的一站式指南
python·flink·状态模式
武子康17 小时前
大数据-122 - Flink Watermark 全面解析:事件时间窗口、乱序处理与迟到数据完整指南
大数据·后端·flink
Hello.Reader1 天前
Flink 状态后端(State Backends)实战原理、选型、配置与调优
大数据·flink
还是大剑师兰特1 天前
Flink面试题及详细答案100道(61-80)- 时间与窗口
flink·大剑师·flink面试题
武子康2 天前
大数据-121 - Flink 时间语义详解:EventTime、ProcessingTime、IngestionTime 与 Watermark机制全解析
大数据·后端·flink
戚砚笙2 天前
Flink进阶:从“会用”到“用明白”的踩坑与实战总结
flink
武子康3 天前
大数据-120 - Flink滑动窗口(Sliding Window)详解:原理、应用场景与实现示例 基于时间驱动&基于事件驱动
大数据·后端·flink
Hello.Reader3 天前
Flink 广播状态(Broadcast State)实战从原理到落地
java·大数据·flink
Hello.Reader3 天前
Flink State V2 实战从同步到异步的跃迁
网络·windows·flink
Hello.Reader3 天前
Apache StreamPark 快速上手从一键安装到跑起第一个 Flink SQL 任务
sql·flink·apache