下面是一些示例代码,我们试图根据一些记录值(在本例中为id)删除重复项。当我发布具有相同ID的2条记录时,我收到了两个打印语句。我期待1.我是流媒体新手,所以我确定我误会了一些东西。
kstream.groupBy((key, value) -> value.getId())
.reduce((aggValue, newValue) -> aggValue)
.toStream()
.foreach((key,value) -> {
System.out.println(value);
})
答案 0 :(得分:2)
reduce操作根据定义的加法器产生一个ktable。
KTable<Interger, String> aggregatedStream = kstream.groupBy((key, value) -> value.getId())
.reduce((aggValue, newValue) -> aggValue)
SO kTable将具有任何ID(来自value.getID()中的键)的最新值。
Kafka流支持逐事件处理。如果记录缓存被禁用,它将触发每个事件的操作。因此,该方法针对2条记录被调用两次,并且print语句将返回该记录的最新值。
聚合计算输入的记录值总和(按键分组)并返回KTable。
示例:
不进行缓存::将为键A发出一系列输出记录,这些记录表示结果汇总表中的更改。括号(())表示更改,左边的数字是新的聚合值,右边的数字是旧的聚合值:<A, (1, null)>, <A, (21, 1)>, <A, (321, 21)>.
具有缓存::将为密钥A发出单个输出记录,该记录可能会在缓存中压缩,从而导致单个输出记录<A, (321, null)>
。该记录将写入聚合的内部状态存储中,并转发给任何下游操作。
通过cache.max.bytes.buffering
参数指定缓存大小,该参数是每个处理拓扑的全局设置。您可以这样设置属性:
// Enable record cache of size 10 MB.
Properties streamsConfiguration = new Properties();
streamsConfiguration.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 10 * 1024 * 1024L);