Tôi đang thử nghiệm một đăng ký lược đồ mới để tải và truy xuất các loại lược đồ avro khác nhau. Trong quá trình thử nghiệm, tôi cần tạo một loạt các loại lược đồ avro khác nhau. Vì nó liên quan đến rất nhiều hoán vị, tôi quyết định tạo lược đồ theo lập trình. Tôi đang sử dụng apache avro SchemaBuilder để làm như vậy.Làm cách nào để bạn cập nhật lược đồ avro hiện có bằng apache avro SchemaBuilder?
tôi tạo ra các Avro sử dụng:
Schema oldSchema = SchemaBuilder
.record("abc")
.aliases("records")
.fields()
.name("field_null")
.type("null")
.noDefault()
.endRecord();
này làm việc. Các Avro tạo trông giống như:
{
"type" : "record",
"name" : "abc",
"fields" : [ {
"name" : "field_null",
"type" : "null"
} ],
"aliases" : [ "records" ]
}
Bây giờ tôi muốn tạo ra một phiên bản mới của giản đồ bằng cách sử dụng thư viện apache Avro như:
{
"type" : "record",
"name" : "abc",
"fields" : [ {
"name" : "field_null",
"type" : "null"
},
{
"name" : "new_field",
"type" : "int",
"default" : 10
}
],
"aliases" : [ "records" ]
}
Đối với điều này, tôi đã cố gắng:
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);
Tôi nhận được:
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)
Vấn đề của tôi là:
- Làm cách nào để thêm phiên bản mới của lược đồ bằng thư viện hiện có?
- Tôi có nên sử dụng lược đồ avBuilder để tạo lược đồ hay đúng hơn là tạo các POJO của riêng tôi để xây dựng lược đồ/lưu tệp avsc trong một thư mục dữ liệu.