Apache flink Flink会话窗口,结束时获取结果

Apache flink Flink会话窗口,结束时获取结果,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一个卡夫卡消息,类似于以下模式: {user:'someUser',value:'SomeValue',时间戳:000000000} 使用Flink stream计算,对这些项目执行一些计数操作 现在我想声明一个会话,在X秒的范围内收集与单个会话相同的user+值,并使用最新的时间戳,然后它将只转发到下一个流一次 所以我写了这样的东西: data.assignTimestampsAndWatermarks(new AssignerWithPeriodicWatermarks<Data&

我有一个卡夫卡消息,类似于以下模式:

{user:'someUser',value:'SomeValue',时间戳:000000000}

使用Flink stream计算,对这些项目执行一些计数操作

现在我想声明一个会话,在X秒的范围内收集与单个会话相同的user+值,并使用最新的时间戳,然后它将只转发到下一个流一次

所以我写了这样的东西:

data.assignTimestampsAndWatermarks(new AssignerWithPeriodicWatermarks<Data>() {
        .....
    })
    .keyBy(new KeySelector<Data, String>(){

        .......
    })
    .window(EventTimeSessionWindows.withGap(Time.minutes(10)))
    .aggregate(new AggregateFunction<Data, Data, Data>() {

        @Override
        public Data createAccumulator() {
            return null;
        }

        @Override
        public Data add(Data value, Data accumulator) {
            if(accumulator == null) {
                accumulator = value;
            }
            return accumulator;

        }

        @Override
        public Data getResult(Data accumulator) {
            return accumulator;
        }

        @Override
        public Data merge(Data a, Data b) {
            return a;
        }
   });
data.assignTimestampsAndWatermarks(新的AssignerWithPeriodicWatermarks(){
.....
})
.keyBy(新的KeySelector(){
.......
})
.window(EventTimeSessionWindows.withGap(Time.minutes(10)))
.aggregate(新的AggregateFunction(){
@凌驾
公共数据收集器(){
返回null;
}
@凌驾
公共数据添加(数据值、数据累加器){
if(累加器==null){
累加器=值;
}
回流蓄能器;
}
@凌驾
公共数据getResult(数据累加器){
回流蓄能器;
}
@凌驾
公共数据合并(数据a、数据b){
返回a;
}
});
但问题是getResult函数是在每个元素上调用的,而不仅仅是在窗口的末尾

我的问题是如何在窗口结束之前不将聚合结果转发到下一个流。据我所知,当没有更多元素时,进程流结果也在向前移动,即使窗口不是end yes

有什么建议吗


谢谢

Flink为评估windows提供了两种不同的方法。在这种情况下,您需要使用另一个

一种方法以增量方式评估每个窗口的内容。这是通过
减少
聚合
得到的结果。当元素分配给窗口时,将调用
ReduceFunction
AggregateFunction
,该元素立即对最终结果做出贡献

另一种方法是将
process
ProcessWindowFunction
一起使用。使用这种方法,直到窗口完成后才对窗口进行求值,此时将使用包含分配给窗口的所有元素的
Iterable
调用一次
ProcessWindowFunction
。这样做的缺点是在触发窗口之前需要存储所有元素,并且如果
ProcessWindowFunction
必须做大量工作来计算其结果,这可能会暂时中断管道,但是有些计算需要以这种方式完成——比如计算不同的元素


有关更多信息,请参阅。

您好,谢谢您的回答。可能我需要编辑我的问题。我的问题不是关于不同的计数。实际上计算是可以的。我只是写了它来描述周围的图片,但很明显,它混淆了我的问题是如何在窗口结束之前不将聚合结果转发到下一个流。据我所知,在没有更多元素的情况下,进程流结果也在向前移动,即使窗口不是end yes。窗口只生成一次结果,除非它们允许延迟和延迟事件,或者如果它们具有重复触发窗口的自定义触发器。