Учитывая процесс потоковой передачи, при котором входящие данные обогащаются производителем, а inner join
между входящим и обогащающим потоками создает обогащенный выходной поток:
CREATE STREAM ENRICHED_OUTPUT AS \
SELECT * FROM INCOMING_STREAM A \
INNER JOIN ENRICHER_STREAM B \
WITHIN 7 DAYS ON A.ID = B.ID
тогда
SELECT * FROM ENRICHED_OUTPUT
даст следующий результат, , как только ключ 123
существует в обоих потоках:
+------+------+--------+--------+
| A_ID | B_ID | A_DATA | B_DATA |
+------+------+--------+--------+
| 123 | 123 | FOO | BAR |
+------+------+--------+--------+
Крутая вещь: если обработка идентификатора 123
в обогащателе задерживается, inner join
гарантирует, что ENRICHED_OUTPUT
задержится, пока ENRICHER_STREAM
не содержит ключ 123
.
Довольно точно, что я хочу.
Но учитывая, что ENRICHER_STREAM
содержит две записи для ключа 123
за последние 7 дней со значениями BAR и BAZ, ENRICHED_OUTPUT
выдаст две строки для каждого входящего ключа 123
:
+------+------+--------+--------+
| A_ID | B_ID | A_DATA | B_DATA |
+------+------+--------+--------+
| 123 | 123 | FOO | BAR |
+------+------+--------+--------+
| 123 | 123 | FOO | BAZ |
+------+------+--------+--------+
довольно точно не то, что я хочу.
Я понимаю, что присоединение к таблице ENRICHER_TABLE
правильно решит соединение 1: 1 и предоставит последнее состояние ключа 123
:
+------+------+--------+--------+
| A_ID | B_ID | A_DATA | B_DATA |
+------+------+--------+--------+
| 123 | 123 | FOO | BAZ |
+------+------+--------+--------+
Что опять-таки в значительной степени то, что я хочу.
Проблема с этим подходом заключается в том, что объединения таблиц потоков не обновляются при обновлении таблицы, и ENRICHED_OUTPUT
пропускает все входящие события, пока ENRICHER_TABLE
не получит ключ 123
Опять же, это не то, что я хочу.
Итак, мой вопрос:
Каким будет чистый подход для обеспечения отношений 1: 1 с записями вне порядка и множественными обновлениями ключа в пределах временного окна?