【问题标题】:Kafka: 1-to-many joinKafka:一对多加入
【发布时间】:2021-09-12 03:33:54
【问题描述】:

基本上我想知道如果我有 topic1 和 topic2 会发生什么,因为 topic1 可以有 N 个 topic2 元素。

Topic1 是用户的事件,topic2 是该用户的配置。作为第一步,我将通过键匹配它们,以从 topic2 中过滤掉不属于该用户的配置,但我仍然会有多个匹配项。我需要在 topic2 中添加更多过滤器才能找到完全匹配的内容,但我不知道这在键连接之后是否可行。

我读到这个:Kafka Stream and KTable One-to-Many Relationship Join

但我仍然想知道如何处理过滤后的数据并进行连接?如果我最终得到一个包含多个条目的 ktable(N 个值的 1 个重复键)。如何在我的流/拓扑中处理它?

另外,我是否需要一个 globalKTable,因为右侧主题(配置)可能位于不同的分区中?

谢谢,

【问题讨论】:

    标签: java apache-kafka


    【解决方案1】:

    Topic1 是用户的事件,topic2 是用户的配置 那个用户。作为第一步,我将通过键匹配它们,以过滤掉 topic2 中不属于该用户的配置,但我会 仍然有多个匹配项。我需要添加更多过滤器 topic2 找到完全匹配,但我不知道这是否可能 在键连接之后。

    您不需要进行所有这些过滤。您需要查看 KStreams API 中的连接语义,并确定哪种方法适用于您的应用程序。

    阅读一下:Crossing the Streams – Joins in Apache Kafka

    从我从您的问题中可以看出,看起来 KStream-GlobalKTable Join 可以满足您的需求 - 假设用户配置是全局状态。在用于 KStream-GlobalKTable 连接的 API 中支持 inner 和 left 连接。

    如果我最终得到一个包含多个条目的 ktable(N 的 1 个重复键 值)。如何在我的流/拓扑中处理它?

    连接操作的输出本身是 KTable(更改日志流)或事件流(在 kstream-kstream 连接情况下可能是窗口化的)。但最终,您可以像处理任何其他操作一样处理拓扑中的输出流。

    【讨论】:

    • 感谢您的留言。所以我假设即使我最终得到一个 1-N 流,该处理与“正常”流处理没有什么不同。只是重复具有相同键和不同值的消息。好的。
    • 关于 GlobalKTable,这是我计划使用的,但是我有一个问题,这可能是本网站本身的一个新问题。由于我的 globalktable 主题与左侧流的键不匹配,因此永远不会匹配。流键:userId。 GlobalKTable 主题键: userid/randomUUID 。由于我无法重新分区表,是否可以修改主题的键并使用中间主题将其转换为 globalkTable?要么,要么我应该尝试不同的方法。谢谢
    • 您可以进行外键连接(取决于您的版本):confluent.io/resources/kafka-summit-2020/…
    • 最后我做了以下事情:我保留了每个主题的原始键。我在第二个主题中做了一个组+聚合。那是一个临时主题,我阅读并转换为 globalKtable 导致 key: user id - value: List 。所以我有一个每个用户 ID 的配置列表。这就是我最终想要的。感谢您的意见。
    • 最后一个问题,你知道是否有可能在同一个拓扑中使用 to() 将流输出到主题,并在同一个拓扑中从新创建一个 kstream/globalktable话题?我的意思是,如果我只是在其中生成结果,我可以立即阅读吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2020-12-08
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多