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.Reader1 小时前
Flink MongoDB SQL Connector Scan/Lookup/Sink 全打通,Upsert、分片集群与缓存一篇讲透
sql·mongodb·flink
Knight_AL3 小时前
Flink 核心算子详解:map / flatMap / filter / process
大数据·python·flink
重生之绝世牛码5 小时前
Linux软件安装 —— Flink集群安装(集成Zookeeper、Hadoop高可用)
大数据·linux·运维·hadoop·zookeeper·flink·软件安装
Blossom.1185 小时前
实时知识增强大模型:基于Flink的流式向量索引与动态RAG系统
大数据·运维·人工智能·python·flink·prompt·知识图谱
Hello.Reader5 小时前
Flink SQL 接入 Amazon Kinesis Data Streams 版本迁移、DDL、EFO/Polling、分区与常见坑一篇搞定
大数据·sql·flink
Hello.Reader1 天前
Flink DynamoDB Connector 用 Streams 做 CDC,用 BatchWriteItem 高吞吐写回
大数据·python·flink
Hello.Reader1 天前
Flink Elasticsearch Connector 从 0 到 1 搭一个高吞吐、可容错的 ES Sink
大数据·elasticsearch·flink
Hello.Reader1 天前
Flink Firehose Sink 把实时流数据稳定写进 Amazon Kinesis Data Firehose
大数据·flink
ask_baidu2 天前
监控Source端Pg对Flink CDC的影响
java·大数据·postgresql·flink
Hello.Reader2 天前
Apache Cassandra Connector:Flink 与宽列存储的高吞吐协作
大数据·flink·apache