Tôi có hai câu hỏi:Avro schema tiến hóa
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ớiSchema 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 đó?Tôi đã thử viết một kỷ lục với
Schema V1
và đọc nó vớiSchema 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.
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