Можно ли в KSQL объединить более двух потоков / таблиц?
Пример:
У меня есть три потока:
CREATE STREAM StreamA (id BIGINT, message VARCHAR) WITH
(KAFKA_TOPIC='TopicA', VALUE_FORMAT='DELIMITED');
CREATE STREAM StreamB (id BIGINT, aid BIGINT, message VARCHAR) WITH .
(KAFKA_TOPIC='TopicB', VALUE_FORMAT='DELIMITED');
CREATE STREAM StreamC (id BIGINT, bid BIGINT, message VARCHAR) WITH
(KAFKA_TOPIC='TopicC', VALUE_FORMAT='DELIMITED');
Я пытаюсь создать еще один поток, присоединив эти три потока:
CREATE STREAM ABCStream AS SELECT * FROM StreamA a JOIN
StreamB b ON b.aid = a.id JOIN StreamC c WITHIN 1 HOURS ON
c.bid = b.id;
У меня следующее исключение:
mismatched input 'JOIN' expecting ';'
Caused by: org.antlr.v4.runtime.InputMismatchException
спасибо за это @ cricket_007. Я взгляну.
Не стесняйтесь голосовать за запрос функции для нескольких присоединений на github.com/confluentinc/ksql/issues/1891.
Нет, в KSQL до версии v5.0 вы можете присоединиться только к двум на запрос. Вам нужно будет соединить ваши запросы в цепочку, примерно так:
Промежуточный поток:
CREATE STREAM ABStream AS \
SELECT * \
FROM StreamA a \
JOIN StreamB b \
ON b.aid = a.id;
Множественный поток
CREATE STREAM ABCStream AS \
SELECT * \
FROM ABStream AB \
JOIN StreamC c \
WITHIN 1 HOURS \
ON c.bid = AB.b_id;
Я пробовал нечто подобное на основе ответа на Эта почта, но столкнулся с проблемой несовместимых разделов: не могу присоединиться к ABSTREAM с STREAMC, поскольку количество разделов не совпадает. ABSTREAM перегородки = 4; Разделы STREAMC = 1. Пожалуйста, переразбейте один так, чтобы количество разделов совпадало.
Это кажется немного неуклюжим, но я заставил его работать, создав другой поток из StreamC, который имел такое же количество разделов, как и промежуточный поток. СОЗДАТЬ STREAM StreamCPartitioned WITH (PARTITIONS = 4) AS SELECT * FROM StreamC PARTITION BY id; Затем объедините этот поток с промежуточным потоком: CREATE STREAM ABCStream AS \ SELECT * \ FROM ABStream AB \ JOIN StreamCPartitioned c \ WITHIN 1 HOURS \ ON c.bid = AB.b_id;
Да, меня это тоже укусило. Мои исходные темы (A и B в этом примере) имели по 1 разделу каждая, а KSQL по умолчанию имеет 4 раздела для тем, которые он создает (C в этом примере), что делает их несовместимыми для присоединения к другим исходным разделам (например, D). Вы должны указать количество разделов в разделе WITH в KSQL при определении потоков, чтобы убедиться, что все они имеют одинаковое количество разделов.
Вы пробовали искать проблемы с github для нескольких присоединений? В прошлый раз, когда я проверил, было как минимум две проблемы с просьбой об этом, поэтому он еще не поддерживается