2012-08-01 21 views
20

Tôi đang cố gắng để có được Python để phân tích lược đồ Avro như sau ...Làm thế nào để lồng các bản ghi trong lược đồ 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) 

... và tôi nhận được ngoại lệ sau đây:

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

Tôi đang làm gì sai?

Trả lời

27

Theo các nguồn tin khác trên web tôi sẽ viết lại định nghĩa địa chỉ thứ hai của bạ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

Cảm ơn, Marco, đã hoạt động. Khai báo thứ hai của tên địa chỉ (tên mà bạn đã viết "AddressUSRecord") có vẻ là cần thiết để phân tích lược đồ, nhưng bỏ qua khi làm việc với dữ liệu tuân thủ lược đồ. –

+1

Điều này rất ít ý nghĩa. Tại sao 'person' có' loại' của 'bản ghi', nhưng' địa chỉ' không thể? –

3

Mỗi lần chúng tôi cung cấp các loại as type tên, lĩnh vực này cần phải được đưa ra như:

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

Tuy nhiên, nếu loại được đặt tên là công đoàn, thì chúng tôi không cần trường loại bổ sung và có thể sử dụng được là:

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

Hy vọng điều này sẽ làm rõ hơn nữa!

Các vấn đề liên quan