我正在测试加载和检索不同种类的avro模式的新模式注册表。在测试过程中,我需要创建一堆不同类型的avro模式。由于涉及很多排列,我决定以编程方式创建模式。 我正在使用apache avro SchemaBuilder来这样做。如何使用apache avro SchemaBuilder更新现有的avro模式?
我创建使用的Avro:
Schema oldSchema = SchemaBuilder
.record("abc")
.aliases("records")
.fields()
.name("field_null")
.type("null")
.noDefault()
.endRecord();
这个工作。创建的Avro的样子:
{
"type" : "record",
"name" : "abc",
"fields" : [ {
"name" : "field_null",
"type" : "null"
} ],
"aliases" : [ "records" ]
}
现在我想使用Apache Avro的库,例如,创建该模式的新版本:
{
"type" : "record",
"name" : "abc",
"fields" : [ {
"name" : "field_null",
"type" : "null"
},
{
"name" : "new_field",
"type" : "int",
"default" : 10
}
],
"aliases" : [ "records" ]
}
对于这一点,我想:
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);
我收到:
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)
我的问题是:
- 如何使用现有库添加架构的新版本?
- 我应该使用avro schemaBuilder来创建模式,还是创建我自己的POJO来构建模式/将avsc文件保存在数据目录中。