在Kafka Streams应用程序中,我们有一个 KTable (不是KStream),我们要在其中计算一些统计信息,例如满足特定属性的所有“行” /条目的最小值或最大值。因此,我们通过将分组属性设置为键将KTable转换为KGroupedTable。使用此分组表,现在可以很容易地计算出计数或总和之类的值。我们只需要将aggregate
方法与特定的适当加法器和减法器函数一起使用即可。 (+/- 1表示计数,+ /-表示总计)。
但是,对于最小/最大等聚合,没有如此简单的减法器功能。一种实现最小/最大聚合的解决方案是将值聚合到地图上,其中加法器功能添加到地图上,减法是从地图上删除 。比起连续的步骤,我们可以map
通过简单地遍历条目来将此映射映射到最小值/最大值。
// Example without types and serdes
KTable sums = myKTable.groupBy((k, v) -> KeyValue.pair(v.getProperty(), v)
.aggregate(() -> 0, (k, v, a) -> a + v.getValue(), , (k, v, a) -> a - v.getValue();
KTable mins = myKTable.groupBy((k, v) -> KeyValue.pair(v.getProperty(), v)
.aggregate(() -> Map.of(), (k, v, a) -> a.put(v.getId(), v.getValue()), , (k, v, a) -> a.remove(v.getId())
.mapValues((k, v) -> StatsHelper.min(v));
但是,这感觉并不十分流畅,因为我们将不得不在整个时间内将整个地图及其所有条目序列化。是否有更好的方法来实现这一目标,即直接通过框架获取所有相关的“行”?还是这根本不可行?