![](/img/trans.png)
[英]Kafka DSL Kstream->Ktable Join - Joined Serialization compile Error
[英]Kafka Tombstoning with a DSL KStream to KTable Transformation
我有一个KStream<String, X>
我基本上想转换为KTable<String, Y>
我能找到的使用 DSL 实现这一点的唯一方法是使用映射,分组然后减少。
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)
)
我希望这可以处理reduce
中updated
的值为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
}
在即将发布的 Apache Kafka 2.5 版本中,添加了一个新的运算符KStream#toTable()
来解决此用例(参见https://issues.apache.org/jira/browse/KAFKA-7658 )
在旧版本中,您需要使用非空的“代理删除值”来避免记录被删除,并让您的 reduce 函数在看到“代理删除值”时返回null
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.