web-dev-qa-db-ja.com

複雑なjsonドキュメントのavroスキーマを定義する方法は?

Avroに変換したいJSONドキュメントがあり、そのためにスキーマを指定する必要があります。これが、avroスキーマを定義したいJSONドキュメントです。

{
 "uid": 29153333,
 "somefield": "somevalue",
 "options": [
   {
     "item1_lvl2": "a",
     "item2_lvl2": [
       {
         "item1_lvl3": "x1",
         "item2_lvl3": "y1"
       },
       {
         "item1_lvl3": "x2",
         "item2_lvl3": "y2"
       }
     ]
   }
 ]
}

非複雑なタイプのスキーマを定義することはできますが、複雑な「オプション」フィールドのスキーマを定義することはできません。

{
  "namespace" : "my.com.ns",
  "type" :  "record",
  "fields" : [
     {"name": "uid", "type": "int"},
     {"name": "somefield", "type": "string"}
     {"name": "options", "type": .....}
  ]
}

助けてくれてありがとう!

9
user2727704

Avro complex types 、具体的には arrays および records を使用する必要があります。そして、これらを一緒にネストします。

{
  "namespace" : "my.com.ns",
  "name": "myrecord",
  "type" :  "record",
  "fields" : [
     {"name": "uid", "type": "int"},
     {"name": "somefield", "type": "string"},
     {"name": "options", "type": {
        "type": "array",
        "items": {
            "type": "record",
            "name": "lvl2_record",
            "fields": [
                {"name": "item1_lvl2", "type": "string"},
                {"name": "item2_lvl2", "type": {
                    "type": "array",
                    "items": {
                        "type": "record",
                        "name": "lvl3_record",
                        "fields": [
                            {"name": "item1_lvl3", "type": "string"},
                            {"name": "item2_lvl3", "type": "string"}
                        ]
                    }
                }}
            ]
        }
     }}
  ]
}

また、準備を改善するために、 スキーマを分割複数のファイルに することができます。

15
Marcel Krcah

このオンラインツール( http://avro4s-ui.landoop.com/ )は非常に実用的であり、指定された有効なjsonによってAVROスキーマを生成できます。

4
panchicore