Apache flink FLINK-加载历史数据并保持30天的窗口

Apache flink FLINK-加载历史数据并保持30天的窗口,apache-flink,flink-streaming,flink-sql,flink-batch,Apache Flink,Flink Streaming,Flink Sql,Flink Batch,我的要求是将30天的数据保存到流中,以便在任何一天进行处理。所以,FLINK应用程序启动的第一天,它将从数据库中获取30天的数据,并将合并到当前流数据。 我的挑战是管理30天的数据窗口。如果我创建滑动窗口30天,滑动时间为1天。差不多 WatermarkStrategy<EventResponse> wmStrategy = WatermarkStrategy.<EventResponse>forBoundedOutOfOrderness(Duration.ofMilli

我的要求是将30天的数据保存到流中,以便在任何一天进行处理。所以,FLINK应用程序启动的第一天,它将从数据库中获取30天的数据,并将合并到当前流数据。 我的挑战是管理30天的数据窗口。如果我创建滑动窗口30天,滑动时间为1天。差不多

WatermarkStrategy<EventResponse> wmStrategy = WatermarkStrategy.<EventResponse>forBoundedOutOfOrderness(Duration.ofMillis(1))
                .withTimestampAssigner((eventResponse, l) -> eventResponse.getLocalDateTime().toEpochSecond(ZoneOffset.MAX));

        ds.assignTimestampsAndWatermarks(wmStrategy)
                .windowAll(SlidingEventTimeWindows.of(Time.days(30), Time.days(1)))
        .process(new ProcessAllWindowFunction<EventResponse, Object, TimeWindow>() {

            @Override
            public void process(Context context, Iterable<EventResponse> iterable, Collector<Object> collector) throws Exception {
    --- proccessing logic
}
WatermarkStrategy wmStrategy=WatermarkStrategy.forboundedautoforderness(持续时间:百万分之一))
.withTimestampAssigner((eventResponse,l)->eventResponse.getLocalDateTime().ToepochsSecond(ZoneOffset.MAX));
ds.sandWatermarks(wmStrategy)
.windowAll(slidengEventTimeWindows.of(Time.days(30),Time.days(1)))
.process(新的ProcessAllWindowFunction(){
@凌驾
公共void进程(上下文上下文、Iterable、收集器)引发异常{
---处理逻辑
}

在这种情况下,process()不会在添加历史数据的第一个元素时立即开始处理。我的假设是``a)默认情况下,第一个事件将是第一个窗口的一部分,并可立即进行处理。b)第二天作业将从窗口中删除最后29天的数据。我对该代码的假设正确吗?感谢您在这方面的帮助。

在这种情况下,我认为您的假设不正确。当您使用
TimeWindow
ProcessFunction
这意味着该函数能够在窗口关闭时处理数据(在您的情况下,30天后)。在这种情况下,时间窗口中的幻灯片意味着第二个窗口将包含第一个窗口的29天,而第31天不是第一个窗口的一部分。

答案基本正确。我只是补充说,您可以使用时间的偏移量。天(-29),并在第一天之后强制关闭。谢谢Dominik和Arvid。这两个建议都很好。因此,显然,等待一整天关闭窗口,然后再进行处理不是一个好主意。如果我想在第一个窗口立即开始处理事件,那么我需要做什么?现在我不知道如何保持30天的窗口到maintain历史数据:(.感谢您在这方面的帮助。谢谢。您应该看看允许您发出部分窗口结果的触发器:)@ArvidHeise,我尝试了Time.days(-29),但它给出的错误为abs(offSet)在我的例子中应该是