Java 卡夫卡从一个给定的主题创建了一个表
我在做一个项目,我被卡在了KTable上 我想从一个主题中获取记录并将它们放在一个KTable(存储)中,这样我就有了一条记录对应一个键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;
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()
?