FlinkSql系列5之 Regular Join

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,因为我们相当于对于之前的把数据都保存到状态里面,当流来了之后保证可以匹配的上,另外一点是这种情况是相当于有回撤流的,也就是如果我们把结果输出到外部系统的话,就需要外部系统支持删除更新!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值