我有一个简单的窗口拓扑:
builder.stream("input-topic", Consumed.with(...))
.groupByKey()
.windowedBy(TimeWindows.of(windowSize).advanceBy(windowAdvance).grace(windowGrace))
.aggregate(Frame::new,
this::windowAggregator,
...
)
.transformValues(FrameTransformer::new)
.toStream()
.selectKey((key, value) -> value...)
.to("output-topic", Produced.with(...));
我想将窗口开始处的实际记录偏移量放入Frame聚合对象中。
如何从windowAggregator
(aggregate()
处理函数)函数访问记录偏移量?
我知道我可以访问FrameTransformer
中的记录偏移量,但这无助于我创建准确的Frame
对象,这些对象以开始和结束偏移量来描述我的窗口。
我听说有一种方法可以通过在.transform()
之前插入另一个groupByKey()
调用来实现偏移量,但是我需要修改事件的模式记录以在其中存储偏移信息。
有没有一种(更简单的)方法来实现我的意图?
更新
实际上,我可以通过以下方式在Frame
对象中获得准确的窗口开始和结束偏移量
builder.stream("input-topic", Consumed.with(...))
.transformValues(EventTransformer::new)
.groupByKey()
.windowedBy(TimeWindows.of(windowSize).advanceBy(windowAdvance).grace(windowGrace))
.aggregate(Frame::new,
this::windowAggregator,
...
)
.toStream()
.selectKey((key, value) -> value...)
.to("output-topic", Produced.with(...));
但是如上所述,以编辑Event
对象的模式为代价。
答案 0 :(得分:2)
如何从windowAggregator(aggregate()处理程序)函数访问记录偏移量?
不能。在聚合之前使用transformValues()
(并丰富Event
对象)的方法是正确的方法。
有人提议扩展API,以允许访问aggregate()
和其他DSL运营商中的记录元数据,但是它从未被推到终点(参见https://cwiki.apache.org/confluence/display/KAFKA/KIP-159%3A+Introducing+Rich+functions+to+Streams)。