Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除下游变更日志对象KafkaStreams_Java_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Java 删除下游变更日志对象KafkaStreams

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

我试图删除值为null的记录,在下游的changelog中,我知道在statestore中,它们只是通过null(逻辑删除)被删除的,但是当您在KTable或流上进行聚合时,它们跳过null而不删除它。我需要找到一种方法,在聚合中设置一个删除标志,让卡夫卡知道可以删除记录。这是我的密码:

   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
。好的,我编辑了我的初始代码,这也是我在过去几天里所做的更改。我想我明白了,谢谢!