apache-flink - FLINK-加载历史数据并保持30天的窗口
问题描述
我的要求是将 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
}
在这种情况下,当添加历史数据的第一个元素时, process() 不会立即开始处理。我的假设是```a)默认情况下,第一个事件将是第一个窗口的一部分,并且可以立即进行处理。b) 第二天的工作将从窗口中删除最后 29 天的数据。我的假设对那段代码是否正确?感谢您对此的帮助。
解决方案
在这种情况下,我认为您的假设不正确。当您使用TimeWindow
withProcessFunction
时,意味着该功能能够在窗口关闭时处理数据(在您的情况下是 30 天后)。在这种情况下,slide
时间窗口意味着第二个窗口将包含第一个窗口的 29 天和不属于第一个窗口的第 31 天。
推荐阅读
- python - 查找外部启动的 Python 进程的详细信息
- java - Spring-Boot:如何处理时间戳(即在 sql 数据库中保存和获取时间戳)
- forms - Django 表单中的空字段验证
- c++ - OR 逻辑运算符从 C++ 到 Fortran 的转换
- machine-learning - 当拍摄的视频很快时,识别视频中特定植物的正确方法是什么?
- c - 使用 libsodium 库中的哈希函数时遇到问题
- reactjs - 道具仅显示在反应 redux 中的内联 if 语句下
- python - 选定点的 xarray 掩码
- pyspark - pyspark groupby 均值使用字典变量
- python - 如何以正确的顺序导入 Scrapy 项目密钥?