Avroスキーマのネストに関する この質問 によると、レコードスキーマをネストする正しい方法は次のとおりです。
{
"name": "person",
"type": "record",
"fields": [
{"name": "firstname", "type": "string"},
{"name": "lastname", "type": "string"},
{
"name": "address",
"type": {
"type" : "record",
"name" : "AddressUSRecord",
"fields" : [
{"name": "streetaddress", "type": "string"},
{"name": "city", "type": "string"}
]
},
}
]
}
フィールドにaddress
という名前を付けて、フィールドのスキーマに別の名前(AddressUSRecord
)を付ける必要がありません。フィールドとスキーマに同じ名前address
を付けることはできますか?
AddressUSRecord
だけでなく、person
スキーマを他の複数のスキーマで使用したい場合はどうなりますか?別のスキーマでAddressUSRecord
を使用する場合、business
としましょう。別の名前を付ける必要がありますか?
理想的には、別のスキーマでAddressUSRecord
を定義し、次にaddress
のタイプをAddressUSRecord
に指定したいです。ただし、Avro 1.8.1がすぐにこの機能をサポートするかどうかは明らかではありません。この 2014記事 は、サブスキーマをカスタムコードで処理する必要があることを示しています。 Avro 1.8.1で再利用可能なスキーマを定義する最良の方法は何ですか?
注:Confluent Inc.のスキーマレジストリで動作するソリューションが欲しいのですが。 Googleグループスレッド があります。これは、スキーマレジストリがスキーマ参照でニースを再生しないことを示唆しているようです。
フィールドとスキーマに同じ名前、住所を付けることはできますか?
はい、レコードにフィールド名と同じ名前を付けることができます。
個人だけでなく、他の複数のスキーマでAddressUSRecordスキーマを使用したい場合はどうなりますか?
いくつかの手法を使用して複数のスキーマを使用できます。avroスキーマパーサークライアント(JVMなど)では、通常names
パラメーター(Java Schema$Parser/parse
メソッドでは、複数のスキーマString
引数を使用できます)。
次に、依存するスキーマを名前付きの型として指定できます。
{
"type": "record",
"name": "Address",
"fields": [
{
"name": "streetaddress",
"type": "string"
},
{
"name": "city",
"type": "string"
}
]
}
そして、これを親スキーマの前にパーサーで実行します。
{
"name": "person",
"type": "record",
"fields": [
{
"name": "firstname",
"type": "string"
},
{
"name": "lastname",
"type": "string"
},
{
"name": "address",
"type": "Address"
}
]
}
ちなみに、これにより、別のファイルから解析することができます。
または、同じ方法でスキーマを参照する単一のUnionスキーマを解析することもできます。
[
{
"type": "record",
"name": "Address",
"fields": [
{
"name": "streetaddress",
"type": "string"
},
{
"name": "city",
"type": "string"
}
]
},
{
"type": "record",
"name": "person",
"fields": [
{
"name": "firstname",
"type": "string"
},
{
"name": "lastname",
"type": "string"
},
{
"name": "address",
"type": "Address"
}
]
}
]
Confluent Inc.のスキーマレジストリで動作するソリューションが欲しいのですが。
スキーマレジストリでは、スキーマの個別の解析はサポートされていませんが、後者のunionタイプへの解析の例はサポートされています。
namespace
をレコードタイプに設定し、後続のフィールドでtype
引数として{namespace}.{name}
を使用できます。残念ながら現在のところ、他のスキーマファイルから型を参照する可能性はありません。