一、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