我有 KStream ,主题到1 的数据如下:
T1-KEY -> {T1}
T2-KEY -> {T2}
和 KTable ,构造如下:
我正在使用 org.apache.kafka.streams.StreamsBuilder 从某些主题 to2 创建 KTable ,如下所示:< / p>
A1-KEY -> { "A1", "Set": [
{"B1", "Rel": "T1"},
{"B2", "Rel": "T1"}
]
}
..
然后将流平面映射并按Key s.t进行分组。生成的 KTable 如下所示:
T1 -> { ["B1", "B2"] }
稍后,主题 to2 :
中出现以下消息A1-KEY -> { "A1", "Set": [
{"B2", "Rel": "T1"}
]
}
现在我希望我的 KTable 能够反映这些变化,如下所示:
T1 -> { ["B2"] }
但它看起来像这样:
T1 -> { ["B1", "B2"] }
我注意到,在我的Aggregator<Tx-KEY, Bx, Set<Bx>>
中,给出的最后一个参数是集["B1", "B2"]
,即使我在聚合之前查看我只得到一个匹配"B2"
。
我是否理解汇总错误或此处发生了什么?
修改
我认为我缩小了范围:显然聚合的Initializer
仅在第一次被非常调用 - 之后聚合总是收到last aggregate
作为最后一个论点,例如
@Override
public Set<Bx> apply(Tx-KEY, Bx value, Set<Bx> aggregate) {
}
第一次调用时Set<Bx> aggregate
为[]
(通过初始化程序创建),第二次调用时为["B1", "B2"]
。
有什么想法吗?
编辑2
public class MyAggregator implements Aggregator<Tx-KEY, Bx, Set<Bx>> {
@Override
public Set<Bx> apply(Tx-KEY key, Bx value, Set<Bx> aggregate) {
aggregate.add(value);
return aggregate;
}
}
编辑3
我不能只使用平面地图,因为我必须组合多个Axe元素,例如
A1-KEY -> { "A1", "Set": [
{"B1", "Rel": "T1"}
]
},
A2-KEY -> { "A2", "Set": [
{"B2", "Rel": "T1"}
]
},
...
然后我希望某些小组喜欢
T1 -> { ["B1", "B2"] }
并在下一次迭代中,当消息
A1-KEY -> { "A1", "Set": [
{"B1", "Rel": "T1"}
]
}
到达我预期
T1 -> { ["B1"] }
...
答案 0 :(得分:1)
请注意,在聚合器中,您只是将元素添加到聚合集中。有了这个逻辑,你的集合(对于给定的密钥)永远不会缩小。在这种情况下,我认为你已经过多地压扁了流。我建议您不要将其展平为(Tx-KEY key, Bx value)
形式的信息,而是保持其设置形式:(Tx-KEY key, Set<Bx> value)
。那你根本不需要聚合。
为实现这一点,我建议你转换输入集
"Set": [
{"B1", "Rel": "T1"},
{"B2", "Rel": "T1"}
]
进入
T1 -> { ["B1", "B2"] }
通过&#34; Rel&#34;进行分组在KStream flatmap方法调用中使用标准java代码(Collections或Streams api)的字段,这样您就只能在KStream上发送带有Set<Bx>
类型值的消息,而不是Bx
- 单独输入的值。< / p>
如果您提供当前flatmap实现的代码,请尽快详细说明。