开窗分组后的Kafka流总和数据

时间:2020-05-27 00:09:32

标签: apache-kafka apache-kafka-streams

我有一个仓库应用程序,需要按小时计算总库存量。
所有项目移动数据都发送到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)

如何获取此类数据集?原始源流来自stream-logistic-movement

2 个答案:

答案 0 :(得分:0)

您似乎不想执行窗口化聚合,而是进行整体聚合,但每小时生成一次当前结果。

因此,您根本不应使用windowBy(),而应仅使用“常规”非窗口聚合。聚合之后,您可以使用suppress()定期发出结果:https://docs.confluent.io/current/streams/javadocs/org/apache/kafka/streams/kstream/Suppressed.html#untilTimeLimit-java.time.Duration-org.apache.kafka.streams.kstream.Suppressed.BufferConfig-

答案 1 :(得分:-1)

阅读不同类型的开窗技术可能很有用。在您的情况下,滑动时间窗可能是解决方案。在此处检查替代方法:https://kafka.apache.org/25/documentation/streams/developer-guide/dsl-api.html#windowing

相关问题