2014-04-08 21 views
21

Ho riscontrato alcuni problemi nella configurazione dei valori predefiniti per i campi avro. Ho un semplice schema come indicato di seguito:Valori predefiniti del campo Avro

data.avsc:

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

Sto usando la v1.7.6 avro-maven-plugin per generare il modello java.

Quando creo un'istanza del modello utilizzando

Data data = Data.newBuilder().build();, si riesce con un'org.apache.avro.AvroRuntimeException eccezione: org.apache.avro.AvroRuntimeException: campo ID Tipo: UNION pos: 0 non fissati e non ha un valore predefinito.

Ma se a specificare la proprietà "default",

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

non ottengo questo errore. Ho letto nella documentazione che il primo schema dell'unione diventa lo schema predefinito. Quindi la mia domanda è, perché devo ancora specificare la proprietà "predefinita"? In quale altro modo posso rendere un campo facoltativo?

E se devo specificare i valori di default, come funziona per un sindacato; devo specificare i valori predefiniti per ogni schema nell'unione e come funziona in termini di ordine/sintassi?

Grazie.

risposta

30

Il valore predefinito di un'unione corrisponde al primo schema dell'unione (Source). Il tuo sindacato è definito come ["long", "null"] quindi il valore predefinito deve essere un numero lungo. null non è un numero lungo, motivo per cui si sta verificando un errore.

Se si desidera definire ancora null come valore predefinito, inserire prima lo schema nullo, ovvero sostituire l'unione in ["null", "long"].

+7

Il semplice inserimento del valore null nel tipo union non lo rende facoltativo, a quanto pare - è così che l'ho avuto e ho ancora ottenuto l'errore. L'aggiunta di null di default è richiesta almeno su Avro 1.7.5 che sto usando. –

+2

https://avro.apache.org/docs/1.7.7/spec.html#Unions menziona questo. –

3

È un errore in Avro che è contrassegnato come Not A Problem. È necessario aggiungere l'attributo predefinito per menzionare il valore predefinito.

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

Consultare AVRO-1803.

+0

Per i valori numerici il valore predefinito deve essere nullo ma quando un tipo di stringa deve essere "null" - i.e "predefinito": null} e "predefinito": "null"} – JamesC

Problemi correlati