Mam dwa pytania:Avro ewolucja schematu
to możliwe, aby korzystać z tego samego czytnika i analizowania zapisów, które zostały napisane z dwóch schematów, które są kompatybilne, na przykład
Schema V2
ma tylko dodatkowe pole opcjonalne w porównaniu doSchema V1
i chcę, aby czytelnik zrozumiał obie rzeczy? Myślę, że odpowiedź brzmi: nie, ale jeśli tak, jak mam to zrobić?Próbowałem pisać rekord z
Schema V1
i czytając goSchema V2
, ale pojawia się następujący błąd:org.apache.avro.AvroTypeException: Znaleziono bla, bla spodziewa
Kiedyś Avro-1.7.3 oraz:
writer = new GenericDatumWriter<GenericData.Record>(SchemaV1);
reader = new GenericDatumReader<GenericData.Record>(SchemaV2, SchemaV1);
Oto przykłady dwóch schematów (próbowałem dodanie nazw jak również, ale bez powodzenia).
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"
}]
}
}]
}]
}
góry dzięki.
Wartości domyślne są koniecznością przy użyciu ewolucję schematu. Jeśli nie podasz wartości domyślnej dla pola, które jest obecne w schemacie czytnika, ale nie w schemacie programu piszącego, Avro nie może dowiedzieć się, jak utworzyć to nowe pole w analizowanej strukturze. – LiMuBei