2016-03-03 19 views
5

Sto tentando di utilizzare Apache Avro per applicare uno schema sui dati esportati da Elastic Search in molti documenti Avro in HDFS (da interrogare con Drill). Sto avendo qualche problema con le impostazioni predefinite AvroProblemi con la serializzazione Avro di documenti json campi mancanti

Dato questo schema:

{  
    "namespace" : "avrotest",  
    "type" : "record",  
    "name" : "people",                         
    "fields" : [                           
    {"name" : "firstname", "type" : "string"},                   
    {"name" : "age", "type" :"int", "default": -1}                  
    ]                              
} 

mi aspetto che un documento JSON come {"firstname" : "Jane"} sarebbe serializzato utilizzando il valore predefinito per il campo -1 età.

predefinito: un valore predefinito per questo campo, utilizzato durante la lettura delle istanze che non dispongono di questo campo (facoltativo).

Tuttavia, questo non sembra accadere

java -jar avro-tools-1.8.0.jar fromjson --schema-file p2.avsc jane.json > jane.avro 

Exception in thread "main" org.apache.avro.AvroTypeException: Expected int. Got END_OBJECT 
    at org.apache.avro.io.JsonDecoder.error(JsonDecoder.java:697) 
    at org.apache.avro.io.JsonDecoder.readInt(JsonDecoder.java:172) 
    at org.apache.avro.io.ValidatingDecoder.readInt(ValidatingDecoder.java:83) 
    at org.apache.avro.generic.GenericDatumReader.readInt(GenericDatumReader.java:511) 
    at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:182) 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152) 
    at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:240) 
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:230) 
    at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:174) 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152) 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:144) 
    at org.apache.avro.tool.DataFileWriteTool.run(DataFileWriteTool.java:99) 
    at org.apache.avro.tool.Main.run(Main.java:87) 
    at org.apache.avro.tool.Main.main(Main.java:76) 

Questo è possibile, o mi sto perdendo qualcosa?

Grazie in anticipo

+0

Ho lo stesso problema – imehl

+0

Sì, mi dica su di esso :( –

+0

Sembra che prima di questo impegno https://github.com/apache/avro/commit/7e4037de2a891fa738aaf8a4f c56f424d6c6833a # diff-c7934590c625ba67bf1b2ad5511a4f58R97 (https://issues.apache.org/jira/browse/AVRO-388) Avro GenericDatumReader è stato in grado di utilizzare i valori predefiniti per i campi saltati, ma non è più possibile farlo. –

risposta

0

Il punto è, se si dichiara il vostro campo nello schema come questo:

{"name": "fieldName", "type": ["int", "null"], default: null } 

Non è sufficiente utilizzare un campo come optional, provare dichiarando in questo modo:

{"name": "fieldName", "type": ["null", "int"], default: null } 
Problemi correlati