2015-01-27 12 views
6

Ho un documento JSON che vorrei convertire in Avro e ho bisogno di uno schema per essere specificato a tale scopo. Ecco il documento JSON per la quale vorrei definire lo schema avro:Come definire lo schema avro per il documento JSON complesso?

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

sono in grado di definire lo schema per i tipi non complessi, ma non per le "opzioni" complesse campo:

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

Grazie per l'aiuto!

risposta

10

È necessario utilizzare Avro complex types, in particolare arrays e records. E poi nido questi insieme:

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

Inoltre, per migliorare readiblity, è possibile split the schemainto multiple files.

+0

> nell'ordine corretto Su un livello di annidamento, ad Avro non interessa l'ordinamento dei campi. I campi sono accessibili per nome durante la deserializzazione, in base allo schema che il lettore conosce. – DandyDev

+0

Con "in ordine corretto" intendevo in ordine gerarchico corrispondente. Ho rimosso quella frase fuorviante. –