KSQL Присоединяйтесь к более чем двум потокам

Можно ли в 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

person Tim Coombe    schedule 31.10.2018    source источник
comment
Вы пробовали искать проблемы с github для нескольких присоединений? В прошлый раз, когда я проверил, было как минимум две проблемы с просьбой об этом, поэтому он еще не поддерживается   -  person OneCricketeer    schedule 31.10.2018
comment
спасибо за это @ cricket_007. Я взгляну.   -  person Tim Coombe    schedule 31.10.2018
comment
Не стесняйтесь голосовать за запрос функции для нескольких присоединений на странице github.com/confluentinc/ksql/issues/1891.   -  person Michael G. Noll    schedule 31.10.2018


Ответы (1)


Нет, в 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;
person Robin Moffatt    schedule 31.10.2018
comment
Я пробовал нечто подобное на основе ответа на This Post, но возникла проблема с несовместимыми разделами: невозможно присоединиться к ABSTREAM с помощью STREAMC, так как количество разделов не совпадает. ABSTREAM перегородки = 4; Разделы STREAMC = 1. Пожалуйста, переразбейте один так, чтобы количество разделов совпадало. - person Tim Coombe; 01.11.2018
comment
Это кажется немного неуклюжим, но я заставил его работать, создав другой поток из 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; - person Tim Coombe; 01.11.2018
comment
Да, меня это тоже укусило. Мои исходные темы (A и B в этом примере) имели по 1 разделу каждая, а KSQL по умолчанию имеет 4 раздела для тем, которые он создает (C в этом примере), что делает их несовместимыми для присоединения к другим исходным разделам (например, D). Вы должны указать количество разделов в разделе WITH в KSQL при определении потоков, чтобы убедиться, что все они имеют одинаковое количество разделов. - person Raymond Saltrelli; 09.08.2019