如何在以日期时间为中心的非事件字段中处理flink中的窗口/聚合



我对流/事件处理有些新,我遇到了以下问题。

我正在使用来自Kafka的发票活动,其中包括"时间戳"以及" ScheduleDat"日期(TIMESTAMP(,并希望在发票" Total"上进行每日聚合。在传统的DB中,我会做类似的事情:

SELECT AVG(total)
FROM "Invoice"
WHERE date_trunc('day', "scheduledAt") = date_trunc('day', CURRENT_TIMESTAMP)

但是,在流中环境中考虑这一点时,我试图使用" eventtime"(取自事件的"时间戳"(和1天的窗口。问题是我真的很想使用" ScheduleDat"时间戳,但是,这是一个可以将来改变事件发生或可能回到过去的领域。

目前,我在调解如何使用流/窗口来实现类似的事物时尤其是在``Scheduledat'dateTime''可以随时间变化时。

时。

关于弗林克的模式或技术是否有任何建议,我可能会遵循以这种方式实现每日平均的建议?

这不是流式传输的最明显用例,但是我会提供有关如何使其工作的草图。

假设有必要适应scheduledAt字段的各种更改,那么有必要保持足够的状态以可能从第一个原则中重新计算所有内容。

这是用flink做到这一点的一种方法。在发票创建的事件中流式传输,以及发票重新安排(以及任何类型的更新(。假设所有聚合都是每天完成的,请按照date_trunc('day', "scheduledAt")的等效键,以便同一天收集所有发票。

您可以使用Windows或ProcessFunction进行聚合,但是我假设ProcessFunction。您可以使用托管的键控状态来保存每天的所有发票,然后在新信息到达时会发出一系列当天发票的报告,或者使用计时器以适当的间隔发布报告。

取决于要计算的聚合,可能没有必要将所有发票保持在弗林克状态。您可以简单地存储汇总值,并随着新的发票(和发票更新(到达而更新这些聚合。例如,如果您只需要报告每天的平均值和总数,则可以在ValueStateReducingState中保留一个计数器和运行总计,并计算这些计数器的平均值。但是,如果您还需要报告最大发票,则必须将它们全部存储。

相关内容

  • 没有找到相关文章

最新更新