我有一个KStream<String, X>
,我实际上想将其转换为KTable<String, Y>
我能找到的使用DSL来实现此目标的唯一方法是使用map,group然后reduce。
val stream: KStream<String, X> = ...
val table: KTable<String, Y> = stream
.mapValues({ value -> toYOrNull(value)})
.groupByKey(Grouped.with(Serdes.String(), ySerde))
.reduce(
{old: Y?, updated: Y? -> updated},
Materialized.`as`<String, Y, KeyValueStore<Bytes, ByteArray>>("y-store")
.withKeySerde(Serdes.String()
.withValueSerde(ySerde)
)
我希望当updated
中reduce
的值为null
时能处理这种情况,但是当我使用TopologyTestDriver
检查商店时,似乎仍然可以有旧版本。我在做什么错了?
这是我的测试
@Test
fun shouldDeleteFromTableWhenNull() {
val store = testDriver.getKeyValueStore<String, Y?>("y-store")
store.put("key", Y())
inputTopic.pipeInput("key", anXThatMapsToANullY)
assertThat(store.get("key")).isNull() // Fails as the old entry is still there
}
答案 0 :(得分:1)
答案 1 :(得分:1)
在即将发布的Apache Kafka 2.5版本中,添加了一个新的运算符KStream#toTable()
来解决此用例(参见https://issues.apache.org/jira/browse/KAFKA-7658)
在较早的版本中,您将需要使用非空的“代理删除值”,以避免记录被删除,并且如果其看到“代理删除值”,则让reduce函数返回null
。 / p>