Kafka- присоединяйтесь к KStream и KTable по составному ключу

У меня две темы - и

plan Тема имеет составной ключ (avro), основанный на двух столбцах, +.
supplier тема введена в столбец supplierId и он содержит столбец planCode но нет memberAge.

      KStream<String, GenericRecord> supplier = builder.stream(supplier_topic);
KTable<GenericRecord, GenericRecord> planTable = builder.table(plan_topic);

ПОСТАВЩИК (KStream): supplierId -> ....,planCode, ....
PLAN (KTable/ GlobalKTable): {planCode, memberAge} -> значение

Я хочу выполнить левое соединение поставщика с планом на plan_code. Как я могу это сделать?

1 ответ

Вы не можете сделать это через потоки dsl, поскольку dsl требует, чтобы ключи были равными. На самом деле это не только ограничение API DSL, но и фактическое физическое требование, которое заставляет ключи сосуществовать локально на одном и том же клиенте физических потоков.

Я считаю, что сделать то, что вы описываете, возможно только в том случае, если входные темы вашей подтопологии имеют 1 раздел, и вы можете использовать 2 преобразователя пунктуации, которые подают toStream() каждой таблицы ktable. Каждый пунктуатор преобразователя будет вручную запрашивать другую таблицу, чтобы найти совпадающие ключи, и пересылать их вниз по течению. Это похоже на пользовательское внутреннее соединение.

На практике вы должны убедиться, что объединенные таблицы являются частью одной и той же подтопологии (вы можете распечатать свою топологию, чтобы убедиться в этом), а ключи, по которым вы соединяетесь, хотя и разные, должны находиться в одном разделе, чтобы они выполнялись одними и теми же потоками. задача.

Для этого вам нужно изменить пользовательский разделитель создателя вашей темы, который имеет составной ключ, чтобы хешировать только первую/общую часть ключа. Или, как упоминалось выше, обе входные темы должны иметь 1 раздел.

Другие вопросы по тегам