我有问题想尝试加入2个流。 mergedKey有100+ 具有相同键和DataStream的列表只有1个具有与mergedKey相同键的列表。我想要从mergedKey与DataStream合并的endStream值中。
//get DataStream
final KStream<String, GenericRecord> DataStream = builder.stream("Datastreams");
// Transform merged to Equals Keys to DataStream.Iot
final KStream<String, GenericRecord> mergedKey = mergedFoIObs
.map((key, value) -> KeyValue.pair(value.get("Datastream").toString(), value));
// Join the DataStream with MergedStream
final KStream<String, String> mergedFoIObsData = mergedKey.leftJoin(
DataStream,
(value, data) -> {
try {
if(data != null{
value.put("Datastream", data.toString());
JSONObject jo = (JSONObject) new JSONParser().parse(value.toString());
return jo.toJSONString();}
return null
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}, JoinWindows.of(10000));
但是我的问题是,在Endstream中,我仅获得1个具有正确值的列表,而其他列表的值为空。
泰铢表示在第一个“回合”之后数据为空。
当我从DataStream转换到KTable时,我遇到了问题,我没有列出正确的列表,但是只有37个列表,因此有60个丢失。
希望您能帮助我。
答案 0 :(得分:0)
对于KStream-KStream连接,是否依赖于记录的时间戳。请查看此博客文章以了解更多详细信息:https://www.confluent.io/blog/crossing-streams-joins-apache-kafka/
对于KStream-KTable连接,这取决于何时将KTable记录加载到KTable中-Kafka Streams尝试根据时间戳同步加载,但这是一种尽力而为的方法。因此,可能会先处理某些KStream记录,而KTable仍然为空。仅在处理完KTable记录(即KTable已更新并包含记录)之后,连续的KStream记录才会成功加入。
请注意,下一个Kafka 2.1版将改善此时间戳同步并提供更强的保证,用户甚至可以配置保证的严格程度。
答案 1 :(得分:0)
“此外,对于不满足联接谓词的此KStream的每个输入记录,将使用另一个流的空值调用提供的ValueJoiner。”
因此,当数据(右值)为null时,您不应返回null,而应返回值(左值)。