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 раздел.