我正在测试一个新的模式注册表,它加载和检索不同类型的avro模式.在测试过程中,我需要创建一堆不同类型的avro架构.由于它涉及很多排列,我决定以编程方式创建模式.我正在使用apache avro SchemaBuilder这样做.
我使用以下方法创建了avro:
Schema oldSchema = SchemaBuilder
.record("abc")
.aliases("records")
.fields()
.name("field_null")
.type("null")
.noDefault()
.endRecord();
Run Code Online (Sandbox Code Playgroud)
这很有效.创建的avro看起来像:
{
"type" : "record",
"name" : "abc",
"fields" : [ {
"name" : "field_null",
"type" : "null"
} ],
"aliases" : [ "records" ]
}
Run Code Online (Sandbox Code Playgroud)
现在我想使用apache avro库创建一个新版本的模式,如:
{
"type" : "record",
"name" : "abc",
"fields" : [ {
"name" : "field_null",
"type" : "null"
},
{
"name" : "new_field",
"type" : "int",
"default" : 10
}
],
"aliases" : [ "records" ]
}
Run Code Online (Sandbox Code Playgroud)
为此,我试过:
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);
Run Code Online (Sandbox Code Playgroud)
我明白了:
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)
Run Code Online (Sandbox Code Playgroud)
我的问题是:
小智 3
你可以尝试这个来创建字段,也许它很笨拙:
Schema.Field field = new Schema.Field("new_field",SchemaBuilder.builder().intType(),
"NewField", 10);
List<Schema.Field> fields = new ArrayList<>();
for (Schema.Field f : oldSchema.getFields()) {
Schema.Field _field = new Schema.Field(f.name(), f.schema(), f.doc(), f.defaultValue());
fields.add(_field);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3177 次 |
| 最近记录: |