【问题标题】:How do I read from a Kafka Table filtering by a specific field?如何从按特定字段过滤的 Kafka 表中读取?
【发布时间】:2021-04-28 04:30:35
【问题描述】:

我有一个 kafka 表,我们将其命名为“MY_TABLE”,并且有一个结构......像这样:

{
    "ROWTIME":123456,
    "ROWKEY":"3_1234_all",
    "id":1,
    "provider_id":3,
    "person_id":"1234"
}

在这个 kafka 表中,我有很多不同的数据,具有不同的 provider_id。 我需要从这个 kafka 表中检索所有不同的 person_id,其中 provider=3。

我是 kafka 的新手,在这里找到了这种方法: https://kafka-tutorials.confluent.io/filter-a-stream-of-events/kstreams.html#consume-filtered-events-from-the-output-topic

但我不确定我是否真的需要一个新主题来获得我将在应用程序中使用的过滤数据。我需要每隔几个小时阅读一次此结果,以便按 person_ids 创建查询过滤。

顺便说一句,这是一个springboot应用程序,所以我将在java上阅读它。

【问题讨论】:

    标签: java apache-kafka


    【解决方案1】:

    不确定“Kafka Table”是什么意思。 Kafka 只知道主题,KSQL 和 Kafka Streams 知道表。

    假设您的意思是“Kafka 主题”,那么您提供的链接已经是一个很好的起点。

    但是,如果您只是想访问应用程序中的数据,则不需要为输出设置不同的主题。

    您可以在原始主题上定义一个 KTable,然后使用交互式查询来访问支持该 KTable 的状态存储:

    这是关于如何定义 KTable 的草图:

    KTable<String, Person> persons = Streamsbuilder.stream("my_topic").filter(p -> p.provider_id == 3).toTable()
    

    您必须在上面的查询中配置正确的序列化器和反序列化器。所以你需要实现一个 PersonDeserializer 和一个 PersonSerializerClass 来将数据写入状态存储。

    有关如何使用交互式查询访问状态存储的更多信息,请参见此处:

    关于您每隔几个小时重新读取数据的计划,这对我来说似乎是一种反模式。 Kafka 主题是从头到尾读取的,只有在极少数情况下,您应该使用同一个使用者多次读取数据。与其重新读取数据,不如在数据上建立一个物化视图(如上面的 KTable 所示),然后查询该物化视图。

    希望这会有所帮助。

    【讨论】:

    • 我相信这会成功。但是如何正确获取与我的 kafka 配置连接的 StreamsBuilder?现在我正在使用带有 KafkaTemplate 的 @Autowired 注释,以便将数据推送到 kafka。我现在正试图弄清楚如何设置此 StreamBuilder 的配置,以便我可以正确阅读我的 kafka 主题...谢谢!
    • 嗨,Igor,这是一个正在运行的示例:github.com/1123/KTable-Interactive-Queries-Perf-Test/blob/main/…
    猜你喜欢
    • 2020-06-23
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多