私は、さまざまな種類のavroスキーマを読み込んで取得する新しいスキーマレジストリをテストしています。テストの過程で、私はさまざまな種類のavroスキーマを作成する必要があります。それは多くの順列を伴うので、私はプログラムでスキーマを作成することに決めました。 私はこのためにApache avro SchemaBuilderを使用しています。apache avro SchemaBuilderを使用して既存のavroスキーマをどのように更新しますか?
私が使用してアブロを作成しました:
Schema oldSchema = SchemaBuilder
.record("abc")
.aliases("records")
.fields()
.name("field_null")
.type("null")
.noDefault()
.endRecord();
これは働いていました。
{
"type" : "record",
"name" : "abc",
"fields" : [ {
"name" : "field_null",
"type" : "null"
} ],
"aliases" : [ "records" ]
}
は、今私はのようにapacheのアブロライブラリを使用してスキーマの新しいバージョンを作成する:作成したアブロがどのように見えるこのため
{
"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ファイルをデータディレクトリに保存する必要があります。