Evolution du schéma Avro
J'ai deux questions:
- Est-il possible d'utiliser le même lecteur et analyser les dossiers qui ont été écrits avec deux schémas qui sont compatibles, par exemple
Schema V2
seulement un champ facultatif par rapport àSchema V1
et je veux que le lecteur de comprendre à la fois? Je pense que la réponse est non, mais si oui, comment dois-je faire? - J'ai essayé d'écrire un enregistrement avec
Schema V1
et de la lecture avecSchema V2
mais j'obtiens l'erreur suivante:org.apache.avro.AvroTypeException: Trouvé foo, attend foo
J'ai utilisé avro-1.7.3 et:
writer = new GenericDatumWriter<GenericData.Record>(SchemaV1);
reader = new GenericDatumReader<GenericData.Record>(SchemaV2, SchemaV1);
Ici sont des exemples des deux schémas (j'ai essayé d'ajouter un espace de noms, mais pas de chance).
Schéma 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"
}]
}
}
}]
}
Schéma 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"
}]
}
}]
}]
}
Merci d'avance.
source d'informationauteur magicalo
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré le même problème. Que peut-être un bug de avro, mais vous pouvez probablement le contourner par l'ajout de "par défaut": null pour le domaine de "l'achat".
Consulter mon blog pour plus de détails: http://ben-tech.blogspot.com/2013/05/avro-schema-evolution.html
Vous pouvez le faire en face d'elle . Dire que l'on peut analyser les données de schem 1 et écrire des données à partir du schéma 2 . Beacause à écrire le temps d'écrire des données dans un fichier et si nous ne fournissons pas de tout terrain à la lecture de l'heure qu'il sera ok. Mais si l'on écrit de moins en moins de terrain que de lire qu'il ne reconnaîtra pas champ supplémentaire à la lecture de l'heure , il sera donner à l'erreur .
Meilleure façon est d'avoir un schéma de mappage de maintenir le schéma comme Confluentes Avro schéma de registre.
Clé De La Vente À Emporter:
http://bytepadding.com/big-data/spark/avro/avro-serialization-de-serialization-using-confluent-schema-registry/