web-dev-qa-db-ja.com

Avroスキーマのネスト

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グループスレッド があります。これは、スキーマレジストリがスキーマ参照でニースを再生しないことを示唆しているようです。

10
Tianxiang Xiong

フィールドとスキーマに同じ名前、住所を付けることはできますか?

はい、レコードにフィールド名と同じ名前を付けることができます。

個人だけでなく、他の複数のスキーマで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タイプへの解析の例はサポートされています。

15
Niel Drummond

namespaceをレコードタイプに設定し、後続のフィールドでtype引数として{namespace}.{name}を使用できます。残念ながら現在のところ、他のスキーマファイルから型を参照する可能性はありません。

2
wikp