【发布时间】:2019-08-24 00:07:38
【问题描述】:
虽然为字段定义了默认值,但kafka-avro-console-producer 完全忽略了它:
$ kafka-avro-console-producer --broker-list localhost:9092 --topic test-avro \
--property schema.registry.url=http://localhost:8081 --property \
value.schema='{"type":"record","name":"myrecord1","fields": \
[{"name":"f1","type":"string"},{"name": "f2", "type": "int", "default": 0}]}'
{"f1": "value1"}
org.apache.kafka.common.errors.SerializationException: Error
deserializing json {"f1": "value1"} to Avro of schema
{"type":"record","name":"myrecord1","fields":
[{"name":"f1","type":"string"},{"name":"f2","type":"int","default":0}]}
Caused by: org.apache.avro.AvroTypeException: Expected int. Got END_OBJECT
at org.apache.avro.io.JsonDecoder.error(JsonDecoder.java:698)
at org.apache.avro.io.JsonDecoder.readInt(JsonDecoder.java:172)
at org.apache.avro.io.ValidatingDecoder.readInt(ValidatingDecoder.java:83)
at org.apache.avro.generic.GenericDatumReader.readInt(GenericDatumReader.java:511)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:182)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152)
at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:240)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:230)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:174)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:144)
at io.confluent.kafka.formatter.AvroMessageReader.jsonToAvro(AvroMessageReader.java:213)
at io.confluent.kafka.formatter.AvroMessageReader.readMessage(AvroMessageReader.java:180)
at kafka.tools.ConsoleProducer$.main(ConsoleProducer.scala:54)
at kafka.tools.ConsoleProducer.main(ConsoleProducer.scala)
那么如何使用它来接受默认值呢?顶级配置设置为"BACKWARD" 兼容性级别检查,尽管我认为这与问题无关。此架构是版本 2,版本 1 仅使用 f1 字段定义,但正如我所说,我认为这并不重要。
【问题讨论】:
-
AFAIK,
default值仅适用于读者/消费者。该字段仍然需要由作者/制作者定义。 -
我已经投了这个有用的评论,如果你推荐它回答,我会接受它作为解决问题的,并且是最有用的。
-
@hdjur_jcv 我相信我的回答解释了如何做 cricket_007 所描述的事情。
-
嗨,Giorgos Myrianthous,我认为您的回答也很有用,对此我表示感谢,但我认为 cricket_007 的回答是正确的,因为它揭示了我的误解。从您的示例中可以看出,在生产者端启用空输入值并不意味着在消费者端使用默认的零值(这应该是我唯一的目标)。
标签: apache-kafka avro kafka-producer-api confluent-schema-registry