У меня есть два вопроса:Avro эволюция схемы
Можно ли использовать один и тот же читатель и анализировать записи, которые были написаны с двумя схемами, которые совместимы, например,
Schema V2
имеет только дополнительное поле для сравнения по сравнению сSchema V1
, и я хочу, чтобы читатель понял и то и другое? Я думаю, что ответ здесь нет, но если да, как мне это сделать?Я пытался писать записи с
Schema V1
и читать его сSchema V2
, но я получаю следующее сообщение об ошибке:org.apache.avro.AvroTypeException: Найдено Foo, ожидая Foo
Я использовал Авро-1.7.3 и:
writer = new GenericDatumWriter<GenericData.Record>(SchemaV1);
reader = new GenericDatumReader<GenericData.Record>(SchemaV2, SchemaV1);
Ниже приведены примеры двух схем (я пытался добавить пространство имен, а также, но не повезло).
схемы 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"
}]
}
}
}]
}
Схема 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"
}]
}
}]
}]
}
Заранее спасибо.
Значение по умолчанию является обязательным при использовании схемы эволюции. Если вы не указали значение по умолчанию для поля, которое присутствует в схеме считывателя, но не в схеме записи, Avro не может понять, как создать это новое поле в анализируемой структуре. – LiMuBei