Ich teste eine neue Schema-Registrierung, die verschiedene Arten von Avro-Schemas lädt und abruft. Während des Tests muss ich eine Reihe verschiedener Arten von Avro-Schemas erstellen. Da es viele Permutationen beinhaltet, entschied ich mich, das Schema programmatisch zu erstellen. Ich verwende den Apache avro SchemaBuilder, um dies zu tun.Wie aktualisierst du ein bestehendes avro-Schema mit apache avro SchemaBuilder?
habe ich die Avro mit:
Schema oldSchema = SchemaBuilder
.record("abc")
.aliases("records")
.fields()
.name("field_null")
.type("null")
.noDefault()
.endRecord();
Das funktionierte. Die Avro erstellt wie folgt aussieht: mit den Apache avro Bibliotheken wie
{
"type" : "record",
"name" : "abc",
"fields" : [ {
"name" : "field_null",
"type" : "null"
} ],
"aliases" : [ "records" ]
}
Jetzt möchte ich eine neue Version des Schemas erstellen:
{
"type" : "record",
"name" : "abc",
"fields" : [ {
"name" : "field_null",
"type" : "null"
},
{
"name" : "new_field",
"type" : "int",
"default" : 10
}
],
"aliases" : [ "records" ]
}
Dazu habe ich versucht:
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);
Ich bekomme:
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)
Mein Problem ist:
- Wie füge ich neue Versionen des Schemas mit vorhandenen Bibliotheken hinzu?
- Soll ich avro SchemaBuilder verwenden, um das Schema zu erstellen oder lieber meine eigenen POJOs zu erstellen, um das Schema zu erstellen/speichern Sie die AVSC-Dateien in einem Datenverzeichnis.