我们具有以下流处理要求。
Source Stream ->
transform(condition check - If (true) then generate MULTIPLE ADDITIONAL messages else just transform the incoming message) ->
output kafka topic
Example:
If condition is true for message B(D,E,F are the additional messages produced)
A,B,C -> A,D,E,F,C -> Sink Kafka Topic
If condition is false
A,B,C -> A,B,C -> Sink Kafka Topic
有没有办法在Kafka流中实现这一目标?
答案 0 :(得分:2)
您可以使用flatMap()
或flatMapValues()
方法。这些方法获取一条记录并产生零个,一个或多个记录。
flatMap()
可以修改键,值及其数据类型,而flatMapValues()
保留原始键并更改值和值数据类型。
这里是一个示例伪代码,其中考虑了新消息“ C”,“ D”,“ E”将具有新密钥。
KStream<byte[], String> inputStream = builder.stream("inputTopic");
KStream<byte[], String> outStream = inputStream.flatMap(
(key,value)->{
List<KeyValue<byte[], String>> result = new LinkedList<>();
// If message value is "B". Otherwise place your condition based on data
if(value.equalsTo("B")){
result.add(KeyValue.pair("<new key for message C>","C"));
result.add(KeyValue.pair("<new key for message D>","D"));
result.add(KeyValue.pair("<new key for message E>","E"));
}else{
result.add(KeyValue.pair(key,value));
}
return result;
});
outStream.to("sinkTopic");
您可以阅读有关此内容的更多信息: https://docs.confluent.io/current/streams/developer-guide/dsl-api.html#streams-developer-guide-dsl-transformations-stateless