Java 删除下游变更日志对象KafkaStreams
我试图删除值为null的记录,在下游的changelog中,我知道在statestore中,它们只是通过null(逻辑删除)被删除的,但是当您在KTable或流上进行聚合时,它们跳过null而不删除它。我需要找到一种方法,在聚合中设置一个删除标志,让卡夫卡知道可以删除记录。这是我的密码:Java 删除下游变更日志对象KafkaStreams,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我试图删除值为null的记录,在下游的changelog中,我知道在statestore中,它们只是通过null(逻辑删除)被删除的,但是当您在KTable或流上进行聚合时,它们跳过null而不删除它。我需要找到一种方法,在聚合中设置一个删除标志,让卡夫卡知道可以删除记录。这是我的密码: public void deleteByEntity(String inputTopic, String target, String stateStoreName) { // Need t
public void deleteByEntity(String inputTopic, String target, String stateStoreName) {
// Need to set property to true in application.properties
// if ("true".equals(utils.getProperty(ApplicationConfigs.KAFKA_DELETE_BY_ENTITY))) {
Materialized<String, String, KeyValueStore<Bytes, byte[]>> storeName =
Materialized.as(stateStoreName);
StreamsBuilder streamsBuilder = new StreamsBuilder();
KStream<String, String> docStream = streamsBuilder.stream(inputTopic);
KTable<?, ?> dataInTable =
docStream
.groupByKey()
.reduce(
(value1, value2) -> {
// System.out.println("aa");
if (value1.equals(target)) {
// If key equals target topic return null, creates tombstone deletes from
// statestore, sends null record downstream
return null;
}
return value2;
},
storeName);
// System.out.println(dataInTable);
}
public void deleteByEntity(字符串inputTopic、字符串目标、字符串stateStoreName){
//需要在application.properties中将属性设置为true
//if(“true”.equals(utils.getProperty(ApplicationConfigs.KAFKA_DELETE_BY_ENTITY))){
物化店名=
具体化.as(stateStoreName);
StreamsBuilder StreamsBuilder=新StreamsBuilder();
KStream docStream=streamsBuilder.stream(inputTopic);
KTable数据表=
docStream
.groupByKey()
.减少(
(值1、值2)->{
//系统输出打印项次(“aa”);
如果(值1.等于(目标)){
//如果key等于target topic return null,则从
//statestore,向下游发送空记录
返回null;
}
返回值2;
},
店名);
//System.out.println(数据可维护);
}
谢谢如果
从Reducer
返回null
,它将从存储中删除数据,并发送相应的输出记录
。因此,不需要进行下游处理
请注意,
null
键和null
值仅在输入记录到reduce()
时被忽略以下代码是否用于查找键然后删除对象?如果(值1.等于(目标)){//如果key等于target topic return null,则从statestore return null中删除topic;}当调用Reducer#apply(…)
时,您实际上不知道该键——因此,在调用groupBy()之前需要将该键复制到值中
。好的,实际上在我调用groupByKey之前,我需要以某种方式获取要从中删除值的键,因此如果键为“a”并且我想将“a”的值设为null,我必须以某种方式获取该键值?是的。并且您需要将要删除的键放入消息的值中,以便apply()
可以读取并返回null
。好的,我编辑了我的初始代码,这也是我在过去几天里所做的更改。我想我明白了,谢谢!