web-dev-qa-db-fra.com

Valeurs par défaut des champs Avro

Je rencontre des problèmes pour configurer des valeurs par défaut pour les champs Avro. J'ai un schéma simple comme indiqué ci-dessous:

data.avsc:

{
 "namespace":"test",
 "type":"record",
 "name":"Data",
 "fields":[
    { "name": "id", "type": [ "long", "null" ] },
    { "name": "value", "type": [ "string", "null" ] },
    { "name": "raw", "type": [ "bytes", "null" ] }
 ]
}

J'utilise le avro-maven-plugin v1.7.6 pour générer le modèle Java Java.

Lorsque je crée une instance du modèle à l'aide de: Data data = Data.newBuilder().build();, il échoue avec une exception:

org.Apache.avro.AvroRuntimeException: org.Apache.avro.AvroRuntimeException: Type d'ID de champ: UNION pos: 0 non défini et n'a pas de valeur par défaut.

Mais si je spécifie la propriété "default",

{ "name": "id", "type": [ "long", "null" ], "default": "null" },

Je ne reçois pas cette erreur. J'ai lu dans la documentation que le premier schéma de l'union devient le schéma par défaut. Donc ma question est, pourquoi dois-je encore spécifier la propriété "par défaut"? Sinon, comment puis-je rendre un champ facultatif?

Et si j'ai besoin de spécifier les valeurs par défaut, comment cela fonctionne-t-il pour une union? dois-je spécifier des valeurs par défaut pour chaque schéma dans l'union et comment cela fonctionne-t-il en termes d'ordre/syntaxe?

Merci.

32
Kesh

La valeur par défaut d'une union correspond au premier schéma de l'union ( Source ). Votre union est définie comme ["long", "null"] la valeur par défaut doit donc être un nombre long. null n'est pas un nombre long, c'est pourquoi vous obtenez une erreur.

Si vous souhaitez toujours définir null comme valeur par défaut, placez d'abord le schéma nul, c'est-à-dire changez l'union en ["null", "long"] au lieu.

49
H.Josef

C'est un bogue à la fin d'Avro qui est marqué comme Not A Problem. Vous devez ajouter un attribut par défaut pour mentionner la valeur par défaut.

{"name": "xxx", "type": ["null", "boolean"], "default": null}

Veuillez consulter AVRO-18 .

14
Rites

Vous devez fournir "default": null ne pas "default": "null" dans le schéma pour faire fonctionner la méthode du générateur

4
blueberry