如何使用基于固定大小计数的窗口实现滑动窗口聚合(或转换)?
如果我有如下所示的流数据
input stream = 1,2,3,4,5,6,7,8...假设时间与这里无关。假设我的聚合函数是平均值,窗口大小固定在3个记录(不是3Millis,3秒,3个小时等),我希望我的输出流是
output stream = avg(1,2,3), avg(2,3,4), avg(3,4,5), avg(4,5,6), avg(5,6,7)... = 2,3,4,5,6...卡夫卡流作品中记录的Windows是“基于时间的”。甚至基类窗口的构造函数都有以下签名:
Window(long startMs, long endMs)因此,我不确定它是否是进行基于的非时间窗口聚合的正确工具。
Apache支持基于计数的滑动和翻滚窗口。这正是我所需要的,但我正在寻找一个类似的功能卡夫卡流。
发布于 2018-03-05 01:08:32
如果您不关心时间排序,则可以使用附加状态实现自定义Transformer。
StreamsBuilder builder = new StreamsBuilder();
builder.addStoreStore(...); // add KeyValueStore here
KStream result = builder.stream("topic").transform(...); // pass in name of your KeyValueStore, too对于自定义Transformer,您可以在列表为窗口的情况下维护每个键的List --只要列表小于窗口大小,就在列表中添加新记录--如果它恰好是大小,则触发计算--如果它超过该大小,则修剪它并在之后触发计算。
有关更多细节,请参见文档:https://kafka.apache.org/10/documentation/streams/developer-guide/processor-api.html (注意,Processor和Transformer基本上是相同的)。
发布于 2018-03-04 05:46:06
如果您希望使用Apache,它也是一个流引擎,那么kafka可以作为数据源连接到它。Storm新版本提供了一个名为“滚动窗口”的概念,它为您的拓扑提供了确切数量的元组。这可以很容易地用来解决你的问题。
想了解更多信息,请看一下storm-component-guide/content/storm-windowing-concepts.html
https://stackoverflow.com/questions/49087533
复制相似问题