Although default is defined for a field, kafka-avro-console-producer
ignores it completely:
$ 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)
How to use it then in order to accept the default? Top level config is set to "BACKWARD"
compatibility Level check, although I don't believe that has anything to do with the question. This schema is version 2, and version 1 was defined with only f1 field, but as I said, I don't think that matters.
As defined in the Avro spec
Therefore, the producer still needs to supply that field.
I'm not sure it's possible to completely exclude a field when using the Avro console producer, because even if you make the field as nullable as Giorgos shows, you still need to explicitly set it.
The error indicates that the message is not compatible with the Avro schema you've defined. As far as I understand, you want to allow
null
values for fieldf2
. To do so, you need to change yourvalue.schema
to (note the definition of"type"
):but you would still need to define
f2
key with null value. The following should do the trick for you:And you can confirm that this has worked using
kafka-avro-console-consumer
: