Java Flink keyby然后window然后聚合所有结果?

Java Flink keyby然后window然后聚合所有结果?,java,apache-flink,Java,Apache Flink,以下是我想在Apache Flink中做的事情: 获取一个输入DataStream,然后按字段键入x,然后执行15分钟滑动窗口,每分钟滑动一次,聚合每个键(x)的结果,然后将所有这些聚合聚合聚合聚合到一个列表中 基本上,如果我有一个输入流,[(a,1,时间1),(b,6,时间14),(b,1,时间12)],我希望结果是[(a,1),(b,7)],通过操作15分钟的滑动窗口和这个特定的滑动窗口 这可能吗?是的,确实可能。Flink的窗口API允许您使用非关键帧窗口跟踪关键帧窗口。来自ApacheF

以下是我想在Apache Flink中做的事情:

获取一个输入
DataStream
,然后按字段键入
x
,然后执行15分钟滑动窗口,每分钟滑动一次,聚合每个键(
x
)的结果,然后将所有这些聚合聚合聚合聚合到一个列表中

基本上,如果我有一个输入流,
[(a,1,时间1),(b,6,时间14),(b,1,时间12)]
,我希望结果是
[(a,1),(b,7)]
,通过操作15分钟的滑动窗口和这个特定的滑动窗口


这可能吗?

是的,确实可能。Flink的窗口API允许您使用非关键帧窗口跟踪关键帧窗口。来自ApacheFlink培训站点的内容涵盖了这种模式。此外,请在有关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())
您可能更愿意使用
ReduceFunction
AggregateFunction
来代替
WindowProcessFunctions
,或者在
WindowProcessFunctions
之外使用


您会注意到,timewindow操作符生成的事件具有反映窗口本身时间边界的时间戳,而不是与落在窗口中的事件的时间戳有关。但是这些事件确实有时间戳,而且流仍然带有水印——因此再次进行时间戳分配是没有意义的。(同样值得注意的是,已设置关键帧的窗口生成的流不再设置关键帧。)

谢谢。我就是这么做的。您对
apply
功能有何想法?应该使用它吗?感谢您的另一个评论,在第一个
过程
函数之后,我的对象的时间戳会发生变化。Flink是如何处理这个问题的?我应该再次进行时间戳分配吗?如果您也不介意回答,有没有办法让第一个窗口从
窗口中第一个事件的时间戳的
层开始
所有
?没有任何理由使用
应用
<代码>进程
更有用,因为它提供了一个上下文对象,其中包含
窗口函数
无法使用的信息。窗口始终与历元对齐——它们不能与第一个事件的时间对齐。