© Anton Dolganin 2025
У нас есть два потока: streamA
и streamB
. Нужно объединять их по ключу, но не всегда события есть в обоих потоках.
Различия типов Join:
Тип Join | Поведение |
---|---|
Inner | Только пары, где ключ есть в обоих |
Left | Все из streamA, + streamB, если есть |
Outer | Все пары из обоих потоков, даже если в одном нет |
KStream<String, String> streamA = builder.stream("streamA");
KStream<String, String> streamB = builder.stream("streamB");
KStream<String, String> joined = streamA.leftJoin(
streamB,
(valueA, valueB) -> valueA + ":" + (valueB == null ? "NO_MATCH" : valueB),
JoinWindows.of(Duration.ofMinutes(5))
);
joined.to("joined-topic");
Что получится:
Если streamA
содержит ключ, а streamB
— нет, вернется valueA:NO_MATCH
.
Если ключ есть в обоих, вернется объединенное значение.
Outer Join
дополнительно возвращает записи из streamB
, если нет соответствия в streamA
.
Жизненный пример — корреляция заказов и оплат в интернет-магазине:
orders
(ключ: order_id, value: заказ)payments
(ключ: order_id, value: платёж)Inner Join
Left Join
Outer Join
© Anton Dolganin 2025