KStream left使用相同的Key加入KStream

时间:2018-08-25 15:08:19

标签: java apache apache-kafka left-join apache-kafka-streams

我有问题想尝试加入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个丢失。

希望您能帮助我。

2 个答案:

答案 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,而应返回值(左值)。

kafka docs link on leftJoin