首页 > 解决方案 > 一个窗口上有两种类型的触发器?

问题描述

我需要你的建议,真的在我的任务中,我需要通过两种类型的聚合来聚合事件。第一种-是onCount,第二种-是onTime

如果事件用于onCount聚合 - 它具有字段数量 -number事件,以及totalCount- 我们应该在聚合之前累积多少事件。

如果事件用于onTime聚合 - 它有字段time-date之后我们应该获取所有累积事件并开始聚合。

我可以按类型、启动窗口和设置触发器对事件进行分组:

stream
.keyBy(e => (e.clientSystemId, e.onMode))
.window(GlobalWindows.create())
.trigger(new WindowAggregationTrigger())

但在触发器中,我需要有状态 - 总计数或时间。在最佳解决方案中-我需要两个不同的触发器-第一个是关于计数,第二个是关于时间聚合。

我的问题是 - 解决这个问题有多漂亮?当我需要两个具有不同逻辑的触发器时——首先是关于计数,其次是关于时间触发器。

我不要求为我解决问题,我寻求建议。

我们在 Apache Flink 1.4 上开发。

标签: apache-flinkflink-streaming

解决方案


不可能在同一个窗口运算符中应用两个不同的触发器,但您可以实现一个触发器来区分onCountonTime情况。

但是,我建议将流拆分为两个流(使用split()或侧输出),在拆分的流上应用具有不同触发器的窗口运算符,然后union()将流一起应用(如果有必要的话)。


推荐阅读