我具有以下kafka流配置。
StreamBuilder builder = stream("TopicA", Serdes.String(), new
SpecificAvroSerde<TestObject>())
.filter((key, value) -> value!=null)
.selectKey((key, value) -> value.getSomeProperty())
.groupByKey(Grouped.with(Serdes.Long(), new
SpecificAvroSerde<TestObject>()))
.reduce((oldValue, newValue) -> newValue),
Materialized.as("someStore"));
这按预期工作,但我想不出如何处理TestObject的Tombstone消息,即使删除也是如此
.filter((key, value) -> value!=null)
当值到达null时,我无法弄清楚如何处理'selectKey'。当value也为null时,我无法使用'value.getSomeProperty()'发送逻辑删除消息。 >
您将如何处理此问题?
答案 0 :(得分:0)
您可以使用transform()
代替selectKey()
并将旧的<key,value>
对存储在状态存储中。这样,在处理<key,null>
时,您可以从存储中获取先前的值,并获取先前提取的新密钥并发送相应的逻辑删除。
但是,reduce()无法处理具有null
键或null
值的记录(那些记录将被删除)。因此,您将需要使用替代值而不是null
来将记录放入Reduce
函数中。如果收到代理,Reduce
可以返回null
。