hi :
我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式 但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。 比如数据 {ts: 2019-12-10 16:24:00 id: 1} {ts: 2019-12-10 16:22:00 id: 1} {ts: 2019-12-10 16:23:00 id: 2} {ts: 2019-12-10 16:21:00 id: 1} {ts: 2019-12-10 16:29:00 id: 2} {ts: 2019-12-10 16:27:00 id: 3} {ts: 2019-12-10 16:26:00 id: 2} |
我觉得既然你想要事实输出数据,那就没必要用窗口,用了时间窗口,那就是按照窗口大小来统计了,不能同时两个都实现吧,把这两种场景分开分别实现,或者你要想得到每分钟的聚合结果,就缩小窗口大小。
---原始邮件--- 发件人: "steven chen"<[hidden email]> 发送时间: 2020年6月3日(周三) 凌晨2:49 收件人: "[hidden email]"<[hidden email]>; 主题: flink sql 窗口场景的问题 hi : 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式 但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。 比如数据 {ts: 2019-12-10 16:24:00 id: 1} {ts: 2019-12-10 16:22:00 id: 1} {ts: 2019-12-10 16:23:00 id: 2} {ts: 2019-12-10 16:21:00 id: 1} {ts: 2019-12-10 16:29:00 id: 2} {ts: 2019-12-10 16:27:00 id: 3} {ts: 2019-12-10 16:26:00 id: 2} |
Hi,
窗口输出可以加emit策略,在watermark未触发时提前输出window的中间结果,不过社区目前标注的是experimental的功能,生产环境中应谨慎使用。 table.exec.emit.early-fire.enabled table.exec.emit.early-fire.delay 可以参考[1]。 https://github.com/apache/flink/blob/master/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/plan/utils/WindowEmitStrategy.scala#L174 <https://github.com/apache/flink/blob/master/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/plan/utils/WindowEmitStrategy.scala#L174> Best Leonard Xu > 在 2020年6月3日,08:22,smq <[hidden email]> 写道: > > 我觉得既然你想要事实输出数据,那就没必要用窗口,用了时间窗口,那就是按照窗口大小来统计了,不能同时两个都实现吧,把这两种场景分开分别实现,或者你要想得到每分钟的聚合结果,就缩小窗口大小。 > > > ---原始邮件--- > 发件人: "steven chen"<[hidden email]> > 发送时间: 2020年6月3日(周三) 凌晨2:49 > 收件人: "[hidden email]"<[hidden email]>; > 主题: flink sql 窗口场景的问题 > > > hi : > 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式 > 但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。 > > 比如数据 > {ts: 2019-12-10 16:24:00 id: 1} > {ts: 2019-12-10 16:22:00 id: 1} > {ts: 2019-12-10 16:23:00 id: 2} > {ts: 2019-12-10 16:21:00 id: 1} > {ts: 2019-12-10 16:29:00 id: 2} > {ts: 2019-12-10 16:27:00 id: 3} > {ts: 2019-12-10 16:26:00 id: 2} > > > > > > > > |
In reply to this post by smq
考虑使用滑动窗口和步长
| | 邵红晓 | | 邮箱:[hidden email] | 签名由 网易邮箱大师 定制 在2020年06月03日 08:22,smq 写道: 我觉得既然你想要事实输出数据,那就没必要用窗口,用了时间窗口,那就是按照窗口大小来统计了,不能同时两个都实现吧,把这两种场景分开分别实现,或者你要想得到每分钟的聚合结果,就缩小窗口大小。 ---原始邮件--- 发件人: "steven chen"<[hidden email]> 发送时间: 2020年6月3日(周三) 凌晨2:49 收件人: "[hidden email]"<[hidden email]>; 主题: flink sql 窗口场景的问题 hi : 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式 但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。 比如数据 {ts: 2019-12-10 16:24:00 id: 1} {ts: 2019-12-10 16:22:00 id: 1} {ts: 2019-12-10 16:23:00 id: 2} {ts: 2019-12-10 16:21:00 id: 1} {ts: 2019-12-10 16:29:00 id: 2} {ts: 2019-12-10 16:27:00 id: 3} {ts: 2019-12-10 16:26:00 id: 2} |
In reply to this post by stevenchen01
Hi
我们这边也有有类似的场景,看看能否对你有所帮助。 我们的做法是不用窗口,按照EventTime分组,比如统计每个小时的数据,那我们就按小时分桶,这样,每来一条数据都会触发计算。 ------------------ 原始邮件 ------------------ 发件人: "steven chen"<[hidden email]>; 发送时间: 2020年6月3日(星期三) 凌晨0:02 收件人: "[hidden email]"<[hidden email]>; 主题: flink sql 窗口场景的问题 hi : 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式 但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。 比如数据 {ts: 2019-12-10 16:24:00 id: 1} {ts: 2019-12-10 16:22:00 id: 1} {ts: 2019-12-10 16:23:00 id: 2} {ts: 2019-12-10 16:21:00 id: 1} {ts: 2019-12-10 16:29:00 id: 2} {ts: 2019-12-10 16:27:00 id: 3} {ts: 2019-12-10 16:26:00 id: 2} |
In reply to this post by stevenchen01
Hi
个人理解可以直接对时间戳字段进行group by,如下: select floor_day_hour_5minutes(timestamp), count(1) from source table group by floor_day_hour_5minutes(timestamp) 上述sql产出retract流,每来一条数据就输出一次,可以满足你的需求,但是有一个问题就是,它不会像窗口一样在窗口结束时删除状态,因此状态会越来越大,你需要设置一些参数去定时删除这些状态,可参考 https://ci.apache.org/projects/flink/flink-docs-stable/dev/table/streaming/query_configuration.html Best, Yichao Yang ------------------ 原始邮件 ------------------ 发件人: "steven chen"<[hidden email]>; 发送时间: 2020年6月3日(星期三) 凌晨0:02 收件人: "[hidden email]"<[hidden email]>; 主题: flink sql 窗口场景的问题 hi : 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式 但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。 比如数据 {ts: 2019-12-10 16:24:00 id: 1} {ts: 2019-12-10 16:22:00 id: 1} {ts: 2019-12-10 16:23:00 id: 2} {ts: 2019-12-10 16:21:00 id: 1} {ts: 2019-12-10 16:29:00 id: 2} {ts: 2019-12-10 16:27:00 id: 3} {ts: 2019-12-10 16:26:00 id: 2} |
Free forum by Nabble | Edit this page |