Kafka Streams通过复杂条件的键加入

时间:2019-12-13 16:37:00

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

我正在尝试通过特定的逻辑将KStreamGlobalKTable结合起来。

    StreamsBuilder builder = new StreamsBuilder();
    KStream<String, Integer> stream = builder.stream(inputTopic1); // key = "ABC"
    GlobalKTable<String, Integer> table = builder.globalTable(inputTopic2); // key = "ABC"

    stream.join(table, // join first by "ABC" = "ABC", then by "AB" = "AB", then by "A" = "A"
            (key, value) -> key,
            (valueLeft, valueRigth) -> {/* identify by which condition the join was performed */});

例如,如果键=“ ABC”,则:

  • 首先,使用完整的密钥加入-即“ ABC” =“ ABC”
  • 然后,如果未加入,则以前两个符号(已删除一个符号)加入-即“ AB” =“ AB”
  • 最后,尝试仅加入一个符号-即“ A” =“ A”

另外,还需要知道执行连接的条件-例如3个字母/ 2个字母/ 1个字母。

问题是,是否有可能还是我应该寻找解决方法?例如,使用相应的键(具有“ ABC”键的表,具有“ AB”键的表和具有“ A”键的表)制作GlobalKTable的副本,并执行3个单独的联接?也许还有其他建议?

谢谢!

1 个答案:

答案 0 :(得分:0)

可以对多个表使用一系列的左联接(如果您经常知道要尝试联接)。如果联接成功,则跳过下一个联接。使用~/.xsession-errorsleftJoin()的组合应该可以让您在每次加入后将流分割为“ joined”和“ retry”。最后,您可以根据需要branch()一起将不同的结果流放在一起。