Kafka-在复合键上连接 KStream 和 KTable

问题描述 投票:0回答:1

我有两个主题 -

plan
supplier

plan
主题有一个基于两列的复合键 (avro),
planCode
+
memberAge

supplier
主题在
supplierId
列上键入,并且包含
planCode
列,但不包含
memberAge

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

供应商(KStream):供应商 ID -> ....,计划代码,....
PLAN (KTable/ GlobalKTable) : {planCode, memberAge} -> 值

我想对供应商进行左连接,计划为

plan_code
。我该怎么做?

apache-kafka apache-kafka-streams kafka-join
1个回答
0
投票

您无法通过流 dsl 执行此操作,因为 dsl 要求密钥相等。实际上,这不仅仅是一个 api dsl 限制,而是一个实际的物理要求,强制密钥在同一物理流客户端上本地共存。

要做你所描述的事情,我相信只有当你的子拓扑的输入主题有 1 个分区并且你可以做 2 个转换器标点符号来馈送到每个 ktable 的 toStream() 时才可能实现。每个转换器标点器将手动查询另一个表以找到匹配的键并将其转发到下游。它就像一个自定义的内部联接。

实际上,您必须确保连接的表是同一子拓扑的一部分(您可以打印拓扑来验证这一点),并且您要连接的键(尽管不同)必须位于同一分区上,以便它们由相同的流任务执行。

为此,您必须更改具有复合键的主题生产者的自定义分区器,以仅散列键的第一个/公共部分。或者如上所述,两个输入主题都具有 1 个分区。

© www.soinside.com 2019 - 2024. All rights reserved.