我有一个KStream
,我想在其中计算事件的某个维度。我这样做如下:
KTable<Windowed<Long>, Counter> ret = input.groupByKey()
.windowedBy(TimeWindows.of(Duration.of(10, SECONDS)))
.aggregate(Counter::new, (k, v, c) -> new Counter(c.count + v.getDimension()));
我想要一个新的KStream
,并将这些聚合作为事件。我可以轻松地做到这一点:
ret.toStream().to("output");
问题在于“输入”主题中的每个事件都会产生一个“输出”主题事件。我只想在窗口结束时才将事件发布到输出主题。例如,如果窗口为一分钟,则每分钟每键发送一个事件。
我想我可以这样:
ret.toStream().foreach((k, v) -> sendToKafkaTopic("output"));
但是我想知道是否有更好/更优雅的方法?
答案 0 :(得分:7)
您可以在版本2.1中使用KTable KTable.suppress的新功能
此方法允许您为窗口计算的每个窗口/键仅获得一个最终结果。
有关KIP-328中的suppres
的更多信息
您可以使用suppress
更新实现,如下所示:
KTable<Windowed<Long>, Counter> ret = input.groupByKey()
.windowedBy(TimeWindows.of(Duration.of(10, SECONDS)))
.aggregate(Counter::new, (k, v, c) -> new Counter(c.count + v.getDimension()))
.suppress(untilWindowCloses(BufferConfig.unbounded()));
ret.toStream().to("output"); // now stream should flush events to the output topic only when the window closes