FlinkSql系列5之 Regular Join
文章目录
前言
join,对于我们无论是实时数仓还是离线数仓都是不可缺少的一部分,我们经常需要涉及到多条流的join来扩充字段,筛选字段等。
一、Regular Join是什么?
Regular Join就是通过条件关联两条流数据输出。
Regular Join 包含以下几种
1.1 Inner Join
在flink无界流式处理中,只有当流Join到的时候才会输出+[L,R]
1.2 Left Join
在flink 流式计算中,以左流为主流,不管右流有没有join的上都会输出左流 ,如果右流可以匹配的上那么就会输出+[L,R],匹配不上也依然会输出 + [L,null],不过如果当左流是先到达的,后面我们右流到了后,符合条件匹配上的时候就会先发出一条撤回流 -[L,null],然后再更新一条追加流,+[L,R].
1.3 Right Join
如上
1.4 Full Join
这个相对比较复杂,就是不管哪边流先到,都会输出结果类似于 +[L,null],+[null,R],
如果后面流到了就撤回前一条,-[L,null],-[null,R],然后再追加+[L,R].
二、实际测试记录
建立源表
CREATE TABLE show_log_table(
--曝光日志id
`log_id` BIGINT,
--曝光日志参数
`show_params` STRING
) WITH (
'connector' = 'datagen',
'rows-per-second' = '2',
'fields.show_params.length' = '1',
'fields.log_id.min' = '1',
'fields.log_id.max' = '100'
)
CREATE TABLE click_log_table(
--点击日志id
`log_id` BIGINT,
--点击日志参数
`click_params` STRING
) WITH (
'connector' = 'datagen',
'rows-per-second' = '2',
'fields.click_params.length' = '1',
'fields.log_id.min' = '1',
'fields.log_id.max' = '10'
)
建目标表
CREATE TABLE sink_table6(
--曝光日志id
`s_id` BIGINT,
--点击日志id
`c_id` BIGINT,
--曝光日志参数
`show_params` STRING,
--点击日志参数
`click_params` STRING
) WITH (
'connector' = 'print'
)
1.Inner Join
INSERT INTO sink_table6
SELECT
show_log_table.log_id as s_id,
click_log_table.log_id as c_id,
show_log_table.show_params,
click_log_table.click_params
FROM show_log_table
INNER JOIN click_log_table ON show_log_table.log_id = click_log_table.log_id
2.Left Join
INSERT INTO sink_table6
SELECT
show_log_table.log_id as s_id,
click_log_table.log_id as c_id,
show_log_table.show_params,
click_log_table.click_params
FROM show_log_table
LEFT JOIN click_log_table ON show_log_table.log_id = click_log_table.log_id
3.Right Join
INSERT INTO sink_table6
SELECT
show_log_table.log_id as s_id,
click_log_table.log_id as c_id,
show_log_table.show_params,
click_log_table.click_params
FROM show_log_table
RIGHT JOIN click_log_table ON show_log_table.log_id = click_log_table.log_id
4.Full Join
INSERT INTO sink_table6
SELECT
show_log_table.log_id as s_id,
click_log_table.log_id as c_id,
show_log_table.show_params,
click_log_table.click_params
FROM show_log_table
FULL JOIN click_log_table ON show_log_table.log_id = click_log_table.log_id
总结
以上是对flinksql regular join的学习记录,对于此方式,在时效性上确实有比较好的结果,但是相反来说,对于state状态的要求很大,需要设置好state ttl,因为我们相当于对于之前的把数据都保存到状态里面,当流来了之后保证可以匹配的上,另外一点是这种情况是相当于有回撤流的,也就是如果我们把结果输出到外部系统的话,就需要外部系统支持删除更新!