【问题标题】:Kafka stream sum data after windowed group窗口组后的Kafka流总和数据
【发布时间】:2020-09-13 22:07:35
【问题描述】:

我有一个仓库应用程序,我需要在其中按小时计算总库存。
所有项目移动数据都发送到 kafka 流(添加/删除)。
这意味着,我可以使用窗口化的 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 项

聚合流结果(按窗口)是这样的:

  • 项目@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

【问题讨论】:

    标签: apache-kafka apache-kafka-streams


    【解决方案1】:

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

    因此,您根本不应该使用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-

    【讨论】:

    • 这看起来很有希望,我会试试的。谢谢
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2011-12-16
      相关资源
      最近更新 更多