我有一个仓库应用程序,需要按小时计算总库存量。
所有项目移动数据都发送到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");
但是如何根据此汇总结果得到总库存?
例如,使用此数据集,假设起始库存为零:
(按窗口)聚合流结果是这样的:
我需要在前端创建小时图,这意味着我需要以下数据集:
如何获取此类数据集?原始源流来自stream-logistic-movement
。
答案 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