2013-03-11 34 views
11

Tôi có hai câu hỏi:Avro schema tiến hóa

  1. Có thể sử dụng bộ đọc cùng và phân tích hồ sơ mà được viết với hai schemas tương thích, ví dụ Schema V2 chỉ có trường tùy chọn bổ sung so với Schema V1 và tôi muốn người đọc hiểu cả hai? Tôi nghĩ câu trả lời ở đây là không, nhưng nếu có, làm thế nào để tôi làm điều đó?

  2. Tôi đã thử viết một kỷ lục với Schema V1 và đọc nó với Schema V2, nhưng tôi nhận được lỗi sau:

    org.apache.avro.AvroTypeException: Tìm thấy foo, mong foo

tôi đã từng Avro-1.7.3 và:

writer = new GenericDatumWriter<GenericData.Record>(SchemaV1); 
    reader = new GenericDatumReader<GenericData.Record>(SchemaV2, SchemaV1); 

Dưới đây là ví dụ về hai schemas (tôi đã thử thêm một namespace là tốt, nhưng không có may mắn).

Schema V1:

{ 
"name": "foo", 
"type": "record", 
"fields": [{ 
    "name": "products", 
    "type": { 
     "type": "array", 
     "items": { 
      "name": "product", 
      "type": "record", 
      "fields": [{ 
       "name": "a1", 
       "type": "string" 
      }, { 
       "name": "a2", 
       "type": {"type": "fixed", "name": "a3", "size": 1} 
      }, { 
       "name": "a4", 
       "type": "int" 
      }, { 
       "name": "a5", 
       "type": "int" 
      }] 
     } 
    } 
}] 
} 

Schema V2:

{ 
"name": "foo", 
"type": "record", 
"fields": [{ 
    "name": "products", 
    "type": { 
     "type": "array", 
     "items": { 
      "name": "product", 
      "type": "record", 
      "fields": [{ 
       "name": "a1", 
       "type": "string" 
      }, { 
       "name": "a2", 
       "type": {"type": "fixed", "name": "a3", "size": 1} 
      }, { 
       "name": "a4", 
       "type": "int" 
      }, { 
       "name": "a5", 
       "type": "int" 
      }] 
     } 
    } 
}, 
{ 
      "name": "purchases", 
      "type": ["null",{ 
        "type": "array", 
        "items": { 
          "name": "purchase", 
          "type": "record", 
          "fields": [{ 
            "name": "a1", 
            "type": "int" 
          }, { 
            "name": "a2", 
            "type": "int" 
          }] 
        } 
      }] 
}] 
} 

Cảm ơn trước.

Trả lời

9

Tôi gặp phải vấn đề tương tự. Đó có thể là một lỗi của avro, nhưng bạn có thể làm việc xung quanh bằng cách thêm "mặc định": null vào trường "mua".

Kiểm tra blog của tôi để biết chi tiết: http://ben-tech.blogspot.com/2013/05/avro-schema-evolution.html

+5

Mặc định giá trị này là bắt buộc khi sử dụng quá trình tiến hóa schema. Nếu bạn không cung cấp một giá trị mặc định cho một trường có trong lược đồ trình đọc, nhưng không có trong lược đồ người viết, Avro không thể tìm ra cách tạo trường mới này trong cấu trúc phân tích cú pháp. – LiMuBei

0

Bạn có thể làm ngược lại của nó. Có nghĩa là bạn có thể phân tích cú pháp lược đồ dữ liệu 1 và ghi dữ liệu từ giản đồ 2. Beacause tại thời gian viết nó ghi dữ liệu vào tập tin và nếu chúng tôi không cung cấp bất kỳ lĩnh vực tại thời gian đọc hơn nó sẽ là ok. Nhưng nếu chúng ta viết ít trường hơn là đọc thì nó sẽ không nhận ra trường thừa ở thời gian đọc như vậy, nó sẽ cho lỗi.

0

Cách tốt nhất là lập bản đồ giản đồ để duy trì giản đồ như đăng ký lược đồ Confluent Avro.

chính Tham Aways:

1. Unlike Thrift, avro serialized objects do not hold any schema. 
2. As there is no schema stored in the serialized byte array, one has to provide the schema with which it was written. 
3. Confluent Schema Registry provides a service to maintain schema versions. 
4. Confluent provides Cached Schema Client, which checks in cache first before sending the request over the network. 
5. Json Schema present in “avsc” file is different from the schema present in Avro Object. 
6. All Avro objects extends from Generic Record 
7. During Serialization : based on schema of the Avro Object a schema Id is requested from the Confluent Schema Registry. 
8. The schemaId which is a INTEGER is converted to Bytes and prepend to serialized AvroObject. 
9. During Deserialization : First 4 bytes are removed from the ByteArray. 4 bytes are converted back to INTEGER(SchemaId) 
10. Schema is requested from the Confluent Schema Registry and using this schema the byteArray is deserialized. 

http://bytepadding.com/big-data/spark/avro/avro-serialization-de-serialization-using-confluent-schema-registry/

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