当前位置: 首页 > 知识库问答 >
问题:

加入外键Kafka流

纪辰沛
2023-03-14

假设我有三个Kafka主题,其中充满了表示不同聚合中发生的业务事件的事件(事件源应用程序)。这些事件允许构建具有以下属性的聚合:

  • 用户:usedId,名称
  • 应用程序的模块:moduleId,name
  • 授予用户应用程序模块:grantId、userId、moduleId、作用域

现在,我想创建一个包含所有授权的流,其中包含用户和产品的名称(而不是id)。我想这么做:

  1. 通过按用户ID对事件进行分组,为用户创建KTable。KTable将userId作为键。没关系

那么如何继续呢?

共有2个答案

养星汉
2023-03-14

此功能作为Kafka Streams 2.4.0的一部分发布。

下面是关于使用此功能的官方教程。

樊奇思
2023-03-14

嗯,目前在Kafka流中没有对外键连接的直接支持<有一个开放的基普:https://issues.apache.org/jira/browse/KAFKA-3705同样的。

目前,可以有一种变通方法来解决这个问题。您可以使用KStream KTable Join。

首先使用聚合的事件集合将用户流和模块流聚合到各自的KTable中。

KTable<String,Object> UserTable = userStream.groupBy(<UserId>).aggregate(<... build collection/latest event>) ;
KTable<String,Object> ModuleTable = moduleStream.groupBy(<ModuleId>).aggregate(<... build collection/latest event>);

现在选择moduleID作为授权流中的键。

KStream<String,Object> grantRekeyedStream = grantStream.selectKey(<moduleId>);

它将键更改为moduleId。现在您可以使用ModuleTable执行Stream-Table Join。它将从右侧为左侧的键加入所有匹配记录。结果流将以ModuleId为键将Grant和Module数据合并到一个流中。

KStream<String,Object> grantModuleStream = grantRekeyedStream.join(moduleTable);

下一步是加入userTable。因此,您需要再次使用userId重新键入grantModuleTable。

KStream<String,Object> grantModuleRekeyedStream = grantModuleTable.selectKey(<Select UserId>);

现在grantModuleRekeyedStream可以通过KStream-KTable Join与userTable连接

 KStream<String,Object> grantModuleUserStream = grantModuleRekeyedStream .join(userTable);

上述流将用户ID作为密钥,并包含该用户的所有授权和模块详细信息。

 类似资料:
  • 我最近在一个streams应用程序中遇到了一个以前没有遇到过的问题,它很难跟踪与键控/连接相关的问题(以及更新后的分区问题)。 我有两个主题(raw_events和processed_users),这两个主题的密钥相同,但是当我试图对这两个主题执行连接时,尽管密钥相同,但只有一些连接是成功的。 为简洁起见,应用程序的基本工作流程如下: null 问题本身是在步骤5中产生的。由于主题和主题之间的连接

  • 若要添加一个外键,点击工具栏的 按钮,并由子表拖拉一个字段到父表的字段。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个外键连接器时,父和子表的边界会分别变为绿色和蓝色。此外,父和子表的参考字段均会高亮显示。 在画布中外键对象的弹出式菜单选项包括: 选项 描述 设计关系 在表设计器中编辑外键。设计器内的选项卡和选项是根据你所选择的图表数据库类型而有所

  • 若要添加一个外键,点击工具栏的 按钮,并由子表拖拉一个字段到父表的字段。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个外键连接器时,父和子表的边界会分别变为绿色和蓝色。此外,父和子表的参考字段均会高亮显示。 在画布中外键对象的弹出式菜单选项包括: 选项 描述 设计关系 在表设计器中编辑外键。设计器内的选项卡和选项是根据你所选择的图表数据库类型而有所

  • 若要添加一个外键,点击工具栏的 按钮,并由子表拖拉一个字段到父表的字段。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个外键连接器时,父和子表的边界会分别变为绿色和蓝色。此外,父和子表的参考字段均会高亮显示。 在画布中外键对象的弹出式菜单选项包括: 选项 描述 设计关系 在表设计器中编辑外键。设计器内的选项卡和选项是根据你所选择的图表数据库类型而有所

  • 基本上,我想知道如果我有topic1和topic2会发生什么,因为topic1可以有N个topic2元素。 Topic1是用户的事件,topic2是该用户的配置。作为第一步,我将通过key匹配它们,从topic2中过滤掉不属于该用户的配置,但我仍然有多个匹配项。我需要向topic2添加更多过滤器来找到精确的匹配项,但我不知道在按key连接之后是否可以这样做。 我读到这个:Kafka Stream和

  • 我们正在使用kafka streams的windows join连接2个流,我们想知道: 为什么KS要在内部主题上增加24小时?例如,我们有一个1小时的窗口,但内部主题保留25小时。我们可以将其配置为不添加这些24小时吗 [更新] 例如,我们创建JoinWindow如下: 虽然我可以看到内部主题(JOINTHIS和OUTEROTHER)是用 这是刚刚在我的机器上的一个空代理(使用confluent