【发布时间】:2017-08-22 12:40:40
【问题描述】:
我正在测试一个新的模式注册表,它可以加载和检索不同类型的 avro 模式。在测试的过程中,我需要创建一堆不同类型的 avro schemas。由于它涉及很多排列,我决定以编程方式创建模式。 我正在使用 apache avro SchemaBuilder 这样做。
我使用以下方法创建了 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 文件保存在数据目录中。
【问题讨论】: