Apache kafka 加窗组后的Kafka流和数据

Apache kafka 加窗组后的Kafka流和数据,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我有一个仓库应用程序,其中我需要按小时计算总库存。 所有项目移动数据都发送到kafka流(添加/删除)。 这意味着,我可以使用加窗的卡夫卡流获得每小时的聚合运动,如下所示 sourceStream .mapValues((k, v) -> v.getType().equalsIgnoreCase("ADD") ? v.getQuantity() : -1 * v.getQuantity()) .groupByK

我有一个仓库应用程序,其中我需要按小时计算总库存。
所有项目移动数据都发送到kafka流(添加/删除)。
这意味着,我可以使用加窗的卡夫卡流获得每小时的聚合运动,如下所示

        sourceStream
                .mapValues((k, v) -> v.getType().equalsIgnoreCase("ADD") ? v.getQuantity() : -1 * v.getQuantity())
                .groupByKey().windowedBy(TimeWindows.of(Duration.ofHours(1)))
                .reduce(Long::sum, Materialized.with(stringSerde, longSerde)).toStream().to("hourly-movement");
但是如何根据这个汇总结果得到总库存量呢?
例如,对于此数据集,假设起始库存为零:

  • 09:15:+50项
  • 09:20:+10项
  • 09:50:+10项
  • 10:35:-40项
  • 10:55:-20项

聚合流结果(按窗口)如下所示:

  • item@09:00/10:00:70
  • item@10:00/11:00:-60

我需要在前端创建小时图表,这意味着我需要此数据集:

  • item@09:00/10:00:70(初始+一小时内移动)
  • item@10:00/11:00:10(10:00时的项目+下一小时的移动,即70-60)

如何获得这样的数据集?原始源流来自
流逻辑运动

读取不同类型的窗口技术可能会很有用。在您的情况下,滑动时间窗口可能是解决方案。检查此处的备选方案:

您似乎不想进行窗口聚合,而是进行总体聚合,但每小时都会发出当前结果


因此,您根本不应该使用
windowBy()
,而应该使用“常规”的非窗口聚合。聚合后,可以使用
suppress()
定期发出结果:

这似乎很有希望,我会试试。谢谢