Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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 卡夫卡从一个给定的主题创建了一个表_Java_Apache Kafka Streams - Fatal编程技术网

Java 卡夫卡从一个给定的主题创建了一个表

Java 卡夫卡从一个给定的主题创建了一个表,java,apache-kafka-streams,Java,Apache Kafka Streams,我在做一个项目,我被卡在了KTable上 我想从一个主题中获取记录并将它们放在一个KTable(存储)中,这样我就有了一条记录对应一个键 static KafkaStreams streams; final Serde<Long> longSerde = Serdes.Long(); final Serde<byte[]> byteSerde = Serdes.ByteArray(); static String topicName;

我在做一个项目,我被卡在了KTable上

我想从一个主题中获取记录并将它们放在一个KTable(存储)中,这样我就有了一条记录对应一个键

    static KafkaStreams streams;

    final Serde<Long> longSerde = Serdes.Long();
    final Serde<byte[]> byteSerde = Serdes.ByteArray();
    static String topicName;
    static String storeName;
    final StreamsBuilder builder = new StreamsBuilder();

    KStream<Long, byte[]> streamed = builder.stream(topicName, Consumed.with(longSerde, byteSerde));
    KTable<Long, byte[]> records = streamed.groupByKey().reduce(
            new Reducer<Long>() {
                @Override
                public Long apply(Long aggValue, Long newValue) {
                    return newValue;
                }
            }, 
            storeName);
静态KafkaStreams流;
最终Serde longerde=Serdes.Long();
最终Serde byteSerde=Serdes.ByteArray();
静态字符串topicName;
静态字符串storeName;
最终StreamsBuilder生成器=新StreamsBuilder();
KStream streamed=builder.stream(topicName,consumered.with(longerde,byteSerde));
KTable records=streamed.groupByKey().reduce(
新减速器(){
@凌驾
公共长应用(长累计值、长新值){
返回新值;
}
}, 
店名);

这是我得到的最接近我认为的答案。

您的方法是正确的,但您需要使用正确的SERDE

在.reduce()函数中,值类型应为
byte[]

 KStream<Long, byte[]> streamed = builder.stream(topicName, Consumed.with(longSerde, byteSerde));
 KTable<Long, byte[]> records = streamed.groupByKey().reduce(
            new Reducer<byte[]>() {
                @Override
                public byte[] apply(byte[] aggValue, byte[] newValue) {
                    return newValue;
                }
            }, 
            Materialized.as(storename).with(longSerde,byteSerde));
KStream streamed=builder.stream(topicName,consumered.with(lonserde,byteSerde));
KTable records=streamed.groupByKey().reduce(
新减速器(){
@凌驾
公共字节[]应用(字节[]aggValue,字节[]newValue){
返回新值;
}
}, 
具体化.as(storename).with(longSerde,byteSerde));

但它不是这样工作的,它给出了以下异常
类型KGroupedStream中的方法reduce(Reducer,Materialized)不适用于参数(new Reducer(){},String)
I也将
Reducer
更改为
Reducer
I在末尾删除了
storeName
,现在它没有给出例外,我还想问你,我在哪里保存这个KTable,以及如何从中获取值?是的,.reduce()没有将storename添加为字符串的实现。相反,你需要给出具体化的结果。您可以在这里定义serde和存储名称。更新了答案。此外,如果要使用状态存储进行交互式查询,则应传递存储名称,否则它将使用内部名称。为什么不使用
builder.table()