Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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
Apache kafka 卡夫卡流:找到流中最小值的合适方法_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Apache kafka 卡夫卡流:找到流中最小值的合适方法

Apache kafka 卡夫卡流:找到流中最小值的合适方法,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我正在使用Kafka Streams版本0.10.0.1,并尝试在流中查找最小值 传入的消息来自一个名为kafka streams topic的主题,有一个键,值是一个JSON负载,如下所示: {"value":2334} 这是一个简单的负载,但我想找到这个JSON的最小值 传出的消息只是一个数字: 2334 钥匙也是信息的一部分 因此,如果传入主题得到: key=1, value={"value":1000} 名为min topic的传出主题将获得 key=1,value=1000 另一

我正在使用Kafka Streams版本0.10.0.1,并尝试在流中查找最小值

传入的消息来自一个名为kafka streams topic的主题,有一个键,值是一个JSON负载,如下所示:

{"value":2334}
这是一个简单的负载,但我想找到这个JSON的最小值

传出的消息只是一个数字: 2334

钥匙也是信息的一部分

因此,如果传入主题得到:

key=1, value={"value":1000}
名为min topic的传出主题将获得

key=1,value=1000
另一个信息来自:

key=1, value={"value":100}
因为这是同一个键,我现在想生成一条key=1 value=100的消息,因为它现在比第一条消息小

现在让我们假设我们得到:

key=2 value=99
在以下情况下,将产生新的信息:

key=2 and value=99 but the key=1 and associated value shouldn't change.
此外,如果我们得到信息:

key=1 value=2000
不应生成任何消息,因为此消息大于当前值100

这是可行的,但我想知道这是否符合API的意图:

公共类MinProcessor实现处理器{
私有处理器上下文上下文;
私钥存储;
private Gson Gson=new Gson();
@凌驾
公共void init(ProcessorContext上下文){
this.context=上下文;
本.上下文.附表(1000);
kvStore=(KeyValueStore)context.getStateStore(“计数”);
}
@凌驾
公共作废进程(字符串键、字符串值){
Long incomingPotentialMin=((双精度)gson.fromJson(value,Map.class).get(“value”)).longValue();
Long minForKey=kvStore.get(key);
System.out.printf(“key:%s incomingPotentialMin:%s minForKey:%s\n”,key,incomingPotentialMin,minForKey);
if(minForKey==null | | incomingPotentialMin
以下是实际运行处理器的代码:

公共类MinLauncher{
公共静态void main(字符串[]args){
TopologyBuilder=新TopologyBuilder();
StateStoreSupplier countStore=Stores.create(“计数”)
.withKeys(Serdes.String())
.withValues(Serdes.Long())
.persistent()
.build();
builder.addSource(“源”、“卡夫卡流主题”)
.addProcessor(“进程”,()->新的MinProcessor(),“源”)
.addStateStore(countStore,“进程”)
.addSink(“sink”、“min主题”、“流程”);
KafkaStreams streams=新的KafkaStreams(生成器,KafkaStreams properties.properties(“kafka streams min poc”);
streams.cleanUp();
streams.start();
Runtime.getRuntime().addShutdownHook(新线程(streams::close));
}
}

不确定您的确切输入数据和结果是什么(也许您可以用以下信息更新您的问题:您的输入记录是什么?您的输出是什么?产生了哪些[您]不期望的[]额外消息]?)

但是,需要进行一些一般性澄清(如果需要,可以在稍后完善此答案)

  • 您基于键进行计算,因此每个键都应该有一个结果(不确定输入中是否有多个不同的键)
  • 您在
    标点符号()
    中发出数据,该数据会定期调用(以内部跟踪的流时间为基础,即基于通过
    TimestampExtractor
    从输入记录中提取的时间戳值)。因此,当调用
    标点符号()
    时,您将写入写入主题的每个键的当前最小值,因此,每个键都可以有多个更新,这些更新都附加到结果主题中。(主题是仅附加的,如果使用同一个键编写两条消息,则会同时看到这两条消息——不存在覆盖。)