I am testing a new schema registry that downloads and retrieves various avro schemas. In the testing process, I need to create a bunch of different types of avro circuits. Since this involves a lot of permutations, I decided to create the circuit programmatically. For this I use apache avro SchemaBuilder .
I created avro using:
Schema oldSchema = SchemaBuilder .record("abc") .aliases("records") .fields() .name("field_null") .type("null") .noDefault() .endRecord();
It worked. The created avro looks like this:
{ "type" : "record", "name" : "abc", "fields" : [ { "name" : "field_null", "type" : "null" } ], "aliases" : [ "records" ] }
Now I want to create a new version of the schema using the apro apache libraries, for example:
{ "type" : "record", "name" : "abc", "fields" : [ { "name" : "field_null", "type" : "null" }, { "name" : "new_field", "type" : "int", "default" : 10 } ], "aliases" : [ "records" ] }
For this, I tried:
Schema.Field field = new Schema.Field("new_field", SchemaBuilder.builder().intType(), "NewField", 10); List<Schema.Field> fields = new ArrayList<>(); fields.add(field); fields.addAll(oldSchema.getFields()); Schema record = Schema.createRecord(oldSchema.getName(), "Changes", oldSchema.getNamespace(), false, fields);
I get:
org.apache.avro.AvroRuntimeException: Field already used: field_null type:NULL pos:0 at org.apache.avro.Schema$RecordSchema.setFields(Schema.java:647) at org.apache.avro.Schema$RecordSchema.<init>(Schema.java:618) at org.apache.avro.Schema.createRecord(Schema.java:167)
My problem:
- How to add new versions of a schema using existing libraries?
- Should I use avro schemaBuilder to create the schema or rather create my own POJOs to create the schema / save the avsc files in the data directory.