2015-01-27 5 views
6

Ich habe ein JSON-Dokument, das ich in Avro konvertieren möchte und ein Schema für diesen Zweck benötigt. Hier ist das JSON-Dokument, für das Ich mag würde das Avro-Schema definieren:Wie definiert man AVRO-Schema für ein komplexes JSON-Dokument?

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

Ich bin in der Lage, das Schema für die nicht-komplexen Typen zu definieren, aber nicht für die komplexen „Optionen“ Feld:

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

Danke für die Hilfe!

Antwort

10

Sie müssen Avro complex types, speziell arrays und records verwenden. Und dann nisten diese zusammen:

{ 
    "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"} 
         ] 
        } 
       }} 
      ] 
     } 
    }} 
    ] 
} 

Auch verbessern readiblity können Sie split the schemainto multiple files.

+0

> in der richtigen Reihenfolge Auf einer Verschachtelungsebene kümmert sich Avro nicht um die Feldreihenfolge. Auf die Felder wird während der Deserialisierung basierend auf dem Schema, das der Leser kennt, durch Namen zugegriffen. – DandyDev

+0

Mit "in der richtigen Reihenfolge" meinte ich in entsprechender hierarchischer Reihenfolge. Ich habe diese irreführende Phrase entfernt. –