gpt4 book ai didi

apache-kafka - 加入Kafka流中的外键

转载 作者:行者123 更新时间:2023-12-01 09:44:03 27 4
gpt4 key购买 nike

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

  • 用户:usedId,名称
  • 应用程序的模块:moduleId,名称
  • 应用程序模块的用户授权:grantId、userId、moduleId、范围

  • 现在我想创建一个包含用户和产品名称(而不是 id)的所有授权流。
    我想这样做:
  • 通过 userId 对事件进行分组,为用户创建一个 KTable。 KTable 以 userId 作为键。没关系。
  • 通过按 productId 对事件进行分组来为产品创建 KTable。 KTable 以 productId 作为键。没关系。
  • 从 Grants 流创建一个流并加入两个 KTable。
    不行。问题是连接似乎只能在主键上进行。但是流的 key 是授权的技术标识符,用户和产品表的 key 不是(它们与授权无关)。

  • 那么如何进行呢?

    最佳答案

    嗯,目前 Kafka Streams 中没有直接支持外键连接。
    有一个开放的 KIP:https://issues.apache.org/jira/browse/KAFKA-3705对于相同的。

    目前,可以有一种解决方法来解决这个问题。您可以使用 KStream-KTable加入 .

    首先汇总用户 串流和模块 通过事件的聚合集合流入相应的 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>);

    现在选择模块ID 作为 中的键。赠款 溪流。
    KStream<String,Object> grantRekeyedStream = grantStream.selectKey(<moduleId>);

    它会将 key 更改为 模块 ID .现在您可以使用 执行 Stream-Table Join模块表 .它将从右侧连接所有匹配的记录,以获得左侧的键。结果流将有 格兰特模块 将数据合并到一个流中模块 ID 作为关键。
    KStream<String,Object> grantModuleStream = grantRekeyedStream.join(moduleTable);

    下一步是加入 用户表 .因此,您需要重新设置 的 key 。授予模块表 再次与 用户ID .
    KStream<String,Object> grantModuleRekeyedStream = grantModuleTable.selectKey(<Select UserId>);

    现在 grantModuleRekeyedStream 可以加入 用户表 KStream-KTable加入
     KStream<String,Object> grantModuleUserStream = grantModuleRekeyedStream .join(userTable);

    以上 Stream 将以用户 ID 作为键,并包含该用户的所有授权和模块详细信息。

    关于apache-kafka - 加入Kafka流中的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53260817/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com