入れ子フィールドが1つしか変わらない2つの同様のスキーマがあります(スキーマ1ではonefield
、スキーマ2ではanotherfield
と呼ばれます)。プログラムで2つのavroスキーマをマージする
SCHEMA1
{
"type": "record",
"name": "event",
"namespace": "foo",
"fields": [
{
"name": "metadata",
"type": {
"type": "record",
"name": "event",
"namespace": "foo.metadata",
"fields": [
{
"name": "onefield",
"type": [
"null",
"string"
],
"default": null
}
]
},
"default": null
}
]
}
SCHEMA2
{
"type": "record",
"name": "event",
"namespace": "foo",
"fields": [
{
"name": "metadata",
"type": {
"type": "record",
"name": "event",
"namespace": "foo.metadata",
"fields": [
{
"name": "anotherfield",
"type": [
"null",
"string"
],
"default": null
}
]
},
"default": null
}
]
}
私はプログラム的にアブロ1.8.0使用して両方のスキーマをマージすることができています:
Schema s1 = new Schema.Parser().parse(schema1);
Schema s2 = new Schema.Parser().parse(schema2);
Schema[] schemas = {s1, s2};
Schema mergedSchema = null;
for (Schema schema: schemas) {
mergedSchema = AvroStorageUtils.mergeSchema(mergedSchema, schema);
}
をして変換するためにそれを使用します〜 {"metadata":{"onefield":null,"anotherfield":null}}
:コードは、期待される出力を示すこと
JsonAvroConverter converter = new JsonAvroConverter();
try {
byte[] example = new String("{}").getBytes("UTF-8");
byte[] avro = converter.convertToAvro(example, mergedSchema);
byte[] json = converter.convertToJson(avro, mergedSchema);
System.out.println(new String(json));
} catch (AvroConversionException e) {
e.printStackTrace();
}
:アブロまたはJSON表現への入力JSON。問題は、マージされたスキーマを見ることができないことです。私はそれアブロ不確定性原理:)呼び出す
Exception in thread "main" org.apache.avro.SchemaParseException: Can't redefine: merged schema (generated by AvroStorage).merged
at org.apache.avro.Schema$Names.put(Schema.java:1127)
at org.apache.avro.Schema$NamedSchema.writeNameRef(Schema.java:561)
at org.apache.avro.Schema$RecordSchema.toJson(Schema.java:689)
at org.apache.avro.Schema$RecordSchema.fieldsToJson(Schema.java:715)
at org.apache.avro.Schema$RecordSchema.toJson(Schema.java:700)
at org.apache.avro.Schema.toString(Schema.java:323)
at org.apache.avro.Schema.toString(Schema.java:313)
at java.lang.String.valueOf(String.java:2982)
at java.lang.StringBuilder.append(StringBuilder.java:131)
:私はシンプルSystem.out.println(mergedSchema)
をすれば、私は次の例外を取得します。 avroはマージされたスキーマで動作するようですが、スキーマをJSONにシリアル化しようとすると失敗します。マージは簡単なスキーマで動作するので、avro 1.8.0のバグのように聞こえます。
何が起こっているのか、それを解決する方法が分かっていますか?任意の回避策(例:代替Schema
シリアライザ)を歓迎します。
以前のバージョンのavro(1.7.6)でも発生しているようです。http://mail-archives.apache.org/mod_mbox/avro-user/201406.mbox/%[email protected]。 nabble.com%3E –