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
    评论
Flink SQL中,常用的配置包括:regular join、Split Distinct优化方法、LocalGlobal优化、MiniBatch等。 regular joinFlink SQL中常用的连接操作,包括inner join、left join和right join。在regular join中,左右表的数据都会一直保存在状态里,不会清理。如果需要清理数据,可以设置TTL(Time-To-Live)或使用Flink SQL的interval join。 Split Distinct优化方法是一种优化方法,可以用于处理包含UDAF(User-Defined Aggregation Function)的Flink SQL语句。但目前在包含UDAF的Flink SQL中不能使用Split Distinct优化方法。 LocalGlobal优化是Flink SQL中的一种优化策略。该优化策略可以将聚合操作拆分为两个GROUP聚合操作,并参与LocalGlobal优化。这个功能在Flink 1.9.0版本及以上版本才支持。 MiniBatch是Flink SQL中的一种机制,可以将输入数据分批处理,以减少资源消耗。开启MiniBatch需要依赖于MiniBatch的参数设置。常用的MiniBatch参数包括: - `table.exec.mini-batch.enabled`:是否开启MiniBatch,默认为false。 - `table.exec.mini-batch.allow-latency`:批量输出的间隔时间,用于控制数据处理的延迟。 - `table.exec.mini-batch.size`:每个批次最多缓存数据的条数,可以根据需求进行调整。 除了上述常用配置外,还可以根据具体需求设置其他参数,如聚合策略`table.optimizer.agg-phase-strategy`,用于控制聚合操作的执行策略。默认为AUTO,还支持TWO_PHASE(使用LocalGlobal两阶段聚合)和ONE_PHASE(仅使用Global一阶段聚合)两种策略。 示例代码中展示了如何设置这些参数: ``` // 初始化table environment TableEnvironment tEnv = ... // 获取tableEnv的配置对象 Configuration configuration = tEnv.getConfig().getConfiguration(); // 设置参数: // 开启MiniBatch configuration.setString("table.exec.mini-batch.enabled", "true"); // 批量输出的间隔时间 configuration.setString("table.exec.mini-batch.allow-latency", "5 s"); // 防止OOM,设置每个批次最多缓存数据的条数,可以设为2万条 configuration.setString("table.exec.mini-batch.size", "20000"); // 开启LocalGlobal configuration.setString("table.optimizer.agg-phase-strategy", "TWO_PHASE"); ``` 综上所述,这些是Flink SQL中常用的配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Flink 优化(六) --------- FlinkSQL 调优](https://blog.csdn.net/m0_51111980/article/details/130102786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值