2012-08-01 9 views
20

estoy tratando de conseguir Python para analizar esquemas Avro como las siguientes ...¿Cómo anidar los registros en un esquema de 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) 

... y tengo la siguiente excepción:

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

¿Qué estoy haciendo mal?

Respuesta

27

Según otras fuentes en la web me gustaría reescribir su segunda definición dirección:

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

Gracias, Marco, eso funcionó. La segunda declaración del nombre de la dirección (aquella en la que escribió "AddressUSRecord") parece ser necesaria para analizar el esquema, pero se ignora cuando se trabaja con datos que se adhieren al esquema. –

+1

Esto tiene poco sentido. ¿Por qué 'persona' puede tener un' tipo' de 'registro', pero' dirección' no puede? –

3

Cada vez que proporcionamos el tipo como tipo con nombre, el campo tiene que ser dado como:

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

Sin embargo, si el tipo con nombre es union, entonces no necesitamos un campo de tipo extra y debe ser utilizable como:

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

¡Espero que esto aclare más!

Cuestiones relacionadas