2012-08-01 12 views
20

che sto cercando di Python per analizzare schemi Avro come la seguente ...Come nidificare i record in uno schema Avro?

from avro import schema 

mySchema = """ 
{ 
    "name": "person", 
    "type": "record", 
    "fields": [ 
     {"name": "firstname", "type": "string"}, 
     {"name": "lastname", "type": "string"}, 
     { 
      "name": "address", 
      "type": "record", 
      "fields": [ 
       {"name": "streetaddress", "type": "string"}, 
       {"name": "city", "type": "string"} 
      ] 
     } 
    ] 
}""" 

parsedSchema = schema.parse(mySchema) 

... e ottengo la seguente eccezione:

avro.schema.SchemaParseException: Type property "record" not a valid Avro schema: Could not make an Avro Schema object from record. 

Che cosa sto facendo di sbagliato?

risposta

27

Secondo altre fonti sul web, vorrei riscrivere la seconda definizione indirizzo:

mySchema = """ 
{ 
    "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"} 
         ] 
        }, 
     } 
    ] 
}""" 
+1

Grazie, Marco, ha funzionato. La seconda dichiarazione del nome dell'indirizzo (quella in cui hai scritto "AddressUSRecord") sembra essere necessaria per analizzare lo schema, ma ignorata quando si lavora con i dati che aderiscono allo schema. –

+1

Questo ha poco senso. Perché 'persona' ha un' tipo' di 'record', ma' address' non può? –

3

Ogni volta che forniamo il tipo come tipo di nome, il campo deve essere dato come:

"name":"some_name", 
"type": { 
      "name":"CodeClassName", 
      "type":"record/enum/array" 
} 

Tuttavia, se il tipo named è union, non è necessario un campo di testo aggiuntivo e dovrebbe essere utilizzabile come:

"name":"some_name", 
"type": [{ 
      "name":"CodeClassName1", 
      "type":"record", 
      "fields": ... 
      }, 
      { 
      "name":"CodeClassName2", 
      "type":"record", 
      "fields": ... 
}] 

Spero che questo chiarisca ulteriormente!