join教学命令如何设置?

join教学命令如何设置?,第1张

将对象合并以形成一个完整的对象 “修改”工具栏: “修改”菜单:“合并” 命令行: join 选择源对象: 选择一条直线、多段线、圆弧椭圆弧或样条曲线 根据选定的源对象,显示以下提示之一:直线 选择要合并到源的直线: 选择一条或多条直线并按 ENTER 键直线对象必须共线(位于同一无限长的直线上),但是它们之间可以有间隙。多段线 选择要合并到源的对象: 选择一个或多个对象并按 ENTER 键对象可以是直线、多段线或圆弧。 对象之间不能有间隙,并且必须位于与 UCS 的 XY 平面平行的同一平面上。圆弧 选择圆弧,以合并到源或进行 [闭合(L)]: 选择一个或多个圆弧并按 ENTER 键,或输入 L 圆弧对象必须位于同一假想的圆上,但是它们之间可以有间隙。 “闭合”选项可将源圆弧转换成圆。注意 合并两条或多条圆弧时,将从源对象开始按逆时针方向合并圆弧。椭圆弧 选择椭圆弧,以合并到源或进行 [闭合(L)]: 选择一个或多个椭圆弧并按 ENTER 键,或输入 L 椭圆弧必须位于同一椭圆上,但是它们之间可以有间隙。 “闭合”选项可将源椭圆弧闭合成完整的椭圆。注意 合并两条或多条椭圆弧时,将从源对象开始按逆时针方向合并椭圆弧。样条曲线 选择要合并到源的样条曲线: 选择一条或多条样条曲线并按 ENTER 键样条曲线对象必须位于同一平面内,并且必须首尾相邻(端点到端点放置)。

本节是 flink sql 流 join 系列的下篇,上篇的链接如下:

废话不多说,咱们先直接上本文的目录和结论,小伙伴可以先看结论快速了解博主期望本文能给小伙伴们带来什么帮助:

书接上文,上文介绍了曝光流在关联点击流时,使用 flink sql regular join 存在的 retract 问题。

本文介绍怎么使用 flink sql interval join 解决这些问题。

flink sql 知其所以然(十二):流 join 很难嘛???(上)

看看上节的实际案例,来看看在具体输入值的场景下,输出值应该长啥样。

场景:即常见的曝光日志流(show_log)通过 log_id 关联点击日志流(click_log),将数据的关联结果进行下发。

来一波输入数据:

曝光数据:

点击数据:

预期输出数据如下:

上节的 flink sql regular join 解决方案如下:

上节说道,flink sql left join 在流数据到达时,如果左表流(show_log)join 不到右表流(click_log) ,则不会等待右流直接输出(show_log,null),在后续右表流数据代打时,会将(show_log,null)撤回,发送(show_log,click_log)。这就是为什么产生了 retract 流,从而导致重复写入 kafka。

对此,我们也是提出了对应的解决思路,既然 left join 中左流不会等待右流,那么能不能让左流强行等待右流一段时间,实在等不到在数据关联不到的数据即可。

当当当!!!

本文的 flink sql interval join 登场,它就能等。

大家先通过下面这句话和图简单了解一下 interval join 的作用(熟悉 DataStream 的小伙伴萌可能已经使用过了),后续会详细介绍原理。

interval join 就是用一个流的数据去关联另一个流的一段时间区间内的数据。关联到就下发关联到的数据,关联不到且在超时后就根据是否是 outer join(left join,right join,full join)下发没关联到的数据。

<figcaption style="margin: 5px 0px 0pxpadding: 0pxoutline: 0pxmax-width: 100%box-sizing: border-box !importantoverflow-wrap: break-word !importanttext-align: centercolor: rgb(136, 136, 136)font-size: 12pxfont-family: PingFangSC-Light">interval join</figcaption>

来看看上述案例的 flink sql interval join sql 怎么写:

这里设置了 show_log.row_time BETWEEN click_log.row_time - INTERVAL '10' MINUTE AND click_log.row_time + INTERVAL '10' MINUTE 代表 show_log 表中的数据会和 click_log 表中的 row_time 在前后 10 分钟之内的数据进行关联。

运行结果如下:

如上就是我们期望的正确结果了。

flink web ui 算子图如下:

<figcaption style="margin: 5px 0px 0pxpadding: 0pxoutline: 0pxmax-width: 100%box-sizing: border-box !importantoverflow-wrap: break-word !importanttext-align: centercolor: rgb(136, 136, 136)font-size: 12pxfont-family: PingFangSC-Light">flink web ui</figcaption>

那么此时你可能有一个问题,结果中的前两条数据 join 到了输出我是理解的,那当 show_log join 不到 click_log 时为啥也输出了?原理是啥?

博主带你们来定位到具体的实现源码。先看一下 transformations。

<figcaption style="margin: 5px 0px 0pxpadding: 0pxoutline: 0pxmax-width: 100%box-sizing: border-box !importantoverflow-wrap: break-word !importanttext-align: centercolor: rgb(136, 136, 136)font-size: 12pxfont-family: PingFangSC-Light">transformations</figcaption>

可以看到事件时间下 interval join 的具体 operator 是 org.apache.flink.table.runtime.operators.join.KeyedCoProcessOperatorWithWatermarkDelay 。

其核心逻辑就集中在 processElement1 和 processElement2 中,在 processElement1 和 processElement2 中使用 org.apache.flink.table.runtime.operators.join.interval.RowTimeIntervalJoin 来处理具体 join 逻辑。 RowTimeIntervalJoin 重要方法如下图所示。

TimeIntervalJoin

下面详细给大家解释一下。

join 时,左流和右流会在 interval 时间之内相互等待,如果等到了则输出数据[+(show_log,click_log)],如果等不到,并且另一条流的时间已经推进到当前这条数据在也不可能 join 到另一条流的数据时,则直接输出[+(show_log,null)],[+(null,click_log)]。

举个例子, show_log.row_time BETWEEN click_log.row_time - INTERVAL '10' MINUTE AND click_log.row_time + INTERVAL '10' MINUTE , 当 click_log 的时间推进到 2021-11-01 11:00:00 时,这时 show_log 来一条 2021-11-01 02:00:00 的数据, 那这条 show_log 必然不可能和 click_log 中的数据 join 到了,因为 click_log 中 2021-11-01 01:50:00 到 2021-11-01 02:10:00 之间的数据以及过期删除了。则 show_log 直接输出 [+(show_log,null)]

以上面案例的 show_log(左表) interval join click_log(右表) 为例(不管是 inner interval join,left interval join,right interval join 还是 full interval join,都会按照下面的流程执行):

上面只是左流 show_log 数据到达时的执行流程(即 ProcessElement1 ),当右流 click_log 到达时也是完全类似的执行流程(即 ProcessElement2 )。

小伙伴萌在使用 interval join 需要注意的两点事项:

本文主要介绍了 flink sql interval 是怎么避免出现 flink regular join 存在的 retract 问题的,并通过解析其实现说明了运行原理,博主期望你读完本文之后能了解到:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11229976.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存