【问题标题】:How to filter events from Kafka Stream based on its JSON Contents如何根据 Kafka Stream 的 JSON 内容过滤事件
【发布时间】:2019-04-21 06:08:39
【问题描述】:

我正在使用 Kafka Streams 从集群中的主题中读取数据,并且我想根据其 JSON 内容过滤消息,即:

JSON 格式:

{
   "id": 1 
   "timestamp": "2019-04-21 12:53:18", 
   "priority": "Medium", 
   "name": "Sample Text",
   "metadata": [{
      "metric_1": "0", 
      "metric_2": "1", 
      "metric_3": "2"
   }]
}

我想从输入主题(我们称之为“输入主题”)中读取消息,过滤它们(假设我只想要优先级为“低”的消息),然后汇总这些消息,并将它们发送到另一个主题(“过滤主题”)

除了创建流本身及其配置之外,我没有那么多代码。我在想我必须配置一些关于 Serdes 的东西,但我不确定如何配置。我也尝试过使用 JSON 反序列化器,但我无法让它工作。

首先,这可能吗?如果是这样,正确的做法是什么?

【问题讨论】:

  • then aggregate 到底是什么意思?要按时间汇总吗?
  • 有可能。您需要阅读消息,将其反序列化为您的自定义对象,然后根据该自定义对象的字段进行过滤,然后将其发布回另一个主题。
  • 你可以使用 spring 的 Kafka 库,也可以使用 Apache 的 Kafka 库,甚至 spring cloud 库。
  • @VasiliySarzhynskyi “聚合”是指将过滤后的消息发送到单独的主题,就是这样

标签: java json apache-kafka apache-kafka-streams


【解决方案1】:

您可以从主题构建流。

    StreamsBuilder builder = new StreamsBuilder();

    // key value type here is both String for me and update based on cases
    KStream<String, String> source = builder.stream("input-topic");

    source.filter(new Predicate<String, String>() {
        @Override
        public boolean test(String s, String s2) {
            // your filter logic here and s and s2 are key/value from topic
            // In your case, s2 should be type of your json Java object
            return false;
        }
    }).groupBy(new KeyValueMapper<String, String, String>() {
        @Override
        public String apply(String key, String value) {
            // your group by logic
            return null;
        }
    }).count().toStream().to("new topic");

【讨论】:

  • 我似乎遇到了一些编译错误,试图使其工作:“类型参数的数量错误;需要 1”“这里不需要接口”“方法没有覆盖或实现超类型的方法" 主要在过滤器部分
  • 我认为你需要 kafka-stream 依赖 org.apache.kafkakafka-streams1.0.1依赖>
猜你喜欢
  • 2019-10-01
  • 2021-10-03
  • 2020-12-16
  • 2021-04-19
  • 1970-01-01
  • 2012-07-03
  • 2021-01-29
  • 1970-01-01
  • 2018-08-09
相关资源
最近更新 更多