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

相关推荐
忙碌5449 小时前
实时流处理架构深度剖析:Apache Flink在实时数仓与风控系统的工程实践
架构·flink·apache
十月南城1 天前
Flink实时计算心智模型——流、窗口、水位线、状态与Checkpoint的协作
大数据·flink·wpf
Hello.Reader2 天前
Flink 任务失败恢复机制Restart Strategy 和 Failover Strategy 怎么配才“又稳又不炸”
大数据·flink·策略模式
郑小憨5 天前
FlinkSQL窗口函数TUMBLE、SESSION 和 HOP的区别
大数据·数据仓库·sql·flink·database
代码匠心5 天前
从零开始学Flink:实时数仓与维表时态Join实战
大数据·flink·kafka·flink sql
海南java第二人5 天前
Flink运行时组件深度解析:Java工程师的架构设计与实战指南
java·大数据·flink
WJX_KOI5 天前
保姆级教程:Apache Flink CDC(standalone 模式)部署 MySQL CDC、PostgreSQL CDC 及使用方法
java·大数据·mysql·postgresql·flink
Hello.Reader5 天前
Flink 大状态 Checkpoint 调优让 Checkpoint 跑得稳、恢复追得上
大数据·flink