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

相关推荐
jiedaodezhuti1 小时前
Flink性能调优基石:资源配置与内存优化实践
大数据·flink
wudl55663 小时前
Flink 1.19 REST API
大数据·flink
武子康9 小时前
大数据-131 Flink CEP 实战 24 小时≥5 次交易 & 10 分钟未支付检测 案例附代码
大数据·后端·flink
wudl55661 天前
Flink SQL 窗口函数详细
sql·flink·linq
Hello.Reader1 天前
Flink DataStream「全分区窗口处理」mapPartition / sortPartition / aggregate / reduce
大数据·python·flink
wudl55661 天前
Flink SQL 与 Kafka 整合详细教程
sql·flink·kafka
wudl55661 天前
flink sql 所有函数详细用例
大数据·sql·flink
武子康1 天前
大数据-130 - Flink CEP 详解 - 捕获超时事件提取全解析:从原理到完整实战代码教程 恶意登录案例实现
大数据·后端·flink
智能化咨询1 天前
Flink受管状态自定义序列化的可演进设计与未来趋势
flink
yumgpkpm1 天前
CMP (类ClouderaCDP7.3(404次编译) )华为鲲鹏Aarch64(ARM)信创环境 查询2100w行 hive 查询策略
数据库·数据仓库·hive·hadoop·flink·mapreduce·big data