【问题标题】:Avro union - type information in resulting jsonAvro union - 生成的 json 中的类型信息
【发布时间】:2021-09-13 09:18:55
【问题描述】:

我有一部分 java 应用程序将 AVRO 编码对象写入 Kafka 主题。我使用org.apache.kafka.clients.producer.Producer 向主题发送消息。 Producer 配置为使用io.confluent.kafka.serializers.KafkaAvroSerializer

AVRO 架构包含以下字段:

{
  "name": "field1",
  "type": [
    "null",
    "string"
  ],
  "default": null
}

这基本上意味着它是一个可以为空的字符串字段。

将对象发送到主题后,我使用以下终端命令检查其内容:

./kafka-avro-console-consumer --bootstrap-server broker-host:9091 --topic test-topic-1
  --property schema.registry.url=http://schema-host:8081 --from-beginning

我希望看到一个具有以下属性的 JSON:

{"field1": "something"}

然而,实际上我看到了:

{"field1": {"string": "something"}}

除此之外,如果我只是在扩展SpecificRecordBase 的对象上使用toString() 方法,然后再将它实际发送到主题,我会看到一个格式符合我预期的JSON。

有没有办法真正获得主题中的第一个选项,而不会将这些额外的类型信息作为 JSON 的一部分?

【问题讨论】:

  • 您是否使用 avro 生成的案例类来生成您的消息给 kafka? case class SomeSchema(var field1: Option[String]) extends org.apache.avro.specific.SpecificRecordBase ?
  • @AkhilanandBenkalVenkanna 是的,正确

标签: java apache-kafka avro confluent-platform confluent-schema-registry


【解决方案1】:

有没有办法真正获得主题中的第一个选项,而不会将这些额外的类型信息作为 JSON 的一部分?

avro-console-consumer 没有。它使用的是GenericRecord,而不是SpecificRecord

由于该字段是联合类型,因此 Avro Record JSON 编码输出必须包含该值的字段的type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多