这是我想在 Apache Flink 中做的事情:输入一个输入,DataStream<T>然后按字段输入x,然后执行一个 15 分钟的滑动窗口,该窗口每分钟滑动一次,聚合每个键 ( x) 的结果,然后将所有这些聚合聚合到一个列表中基本上,如果我有一个输入流,[(a, 1, Time 1), (b, 6, Time 14), (b, 1, Time 12)]我希望结果是[(a, 1), (b, 7)],通过对 15 分钟滑动窗口和这个特定的滑动窗口进行操作。这可能吗?
1 回答
慕运维8079593
TA贡献1876条经验 获得超5个赞
是的,这确实是可能的。Flink 的窗口 API 允许你跟随一个键控窗口和一个非键控窗口。来自 Apache Flink 培训站点的这个练习涵盖了这种模式。此外,请在文档的此页面上有关 Windows 的“惊喜”列表中查找标题为“Windows 可以跟随 Windows”的部分。
粗略地说,你会这样做:
stream .keyBy(e -> e.x) .timeWindow(Time.minutes(15), Time.minutes(1)) .process(new ProduceKeyedResults()) .timeWindowAll(Time.minutes(15), Time.minutes(1)) .process(new ProduceOverallResults())
您可能宁愿使用 aReduceFunction或 anAggregateFunction来代替WindowProcessFunctions.
您会注意到时间窗口运算符产生的事件具有反映窗口本身时间边界的时间戳,而不是与落入窗口的事件的时间戳有关。但是事件确实有时间戳,并且流仍然带有水印——所以再次进行时间戳分配是没有意义的。(另外值得注意的是,键控窗口产生的流不再键控。)
添加回答
举报
0/150
提交
取消
