如何在日期时间中心,非事件时间字段中处理Flink中的窗口/聚合?

时间:2018-02-07 18:05:17

标签: apache-flink

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

我正在使用来自Kafka的Invoice活动,这些活动有一个活动"时间戳"以及" scheduledAt"日期(时间戳),并希望在发票上总计'执行每日汇总。在传统的数据库中,我会做类似的事情:

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

但是,在流媒体环境中考虑这一点时,我试图使用' eventtime' (取自活动'时间戳')和1天的窗口。问题是我真的很想使用' scheduledAt'但是,时间戳是一个可以在事件发生时甚至可能在过去发生的远期改变的字段。

目前我无法协调如何使用流媒体/窗口来实现类似的功能,尤其是在“预定”时间内。 datetime可以及时向前和向后改变。

对于Flink中的模式或技术是否有任何建议我可以遵循以这种方式实现日常平均?

1 个答案:

答案 0 :(得分:0)

这不是流媒体最明显的用例,但我会提供一个如何使其工作的草图。

假设有必要适应scheduledAt字段的所有变化,那么就必须保持足够的状态,以便从第一原则中重新计算所有内容。

这是使用Flink实现这一目标的一种方法。流入事件以创建发票,以及发票重新安排(以及任何类型的更新,确实)。假设所有聚合都是每天完成的,请将流键入相当于date_trunc('day', "scheduledAt")的值,以便将同一天的所有发票收集在一起。

您可以使用窗口或ProcessFunction进行聚合,但我会假设ProcessFunction。您可以使用托管,键控状态来保存每个给定日期的所有发票,并在新信息到达时发出当天发票的持续更新报告流,或使用计时器以适当的时间间隔发出报告。 / p>

根据计算的聚合,可能没有必要将所有发票保持在Flink状态。您可以简单地存储聚合值,并在新发票(和发票更新)到达时更新这些聚合。例如,如果您只需要报告每天的平均值和总数,则可以在ValueStateReducingState中保留计数器和运行总计,并计算其中的平均值。但如果您还需要报告最高发票,那么您必须将它们全部存储起来。