Опитвам се да напиша много лесна схема на avro (лесна, защото просто посочвам текущия си проблем), за да напиша файл с данни на avro въз основа на данни, съхранени във формат json. Номерът е, че едно поле не е задължително и едно от avrotools или аз не го прави правилно.
Целта не е да напиша собствен сериализатор, крайната цел ще бъде това да е в потока, аз съм в ранните етапи.
Данните (работи), във файл с име so.log:
{
"valid": {"boolean":true}
, "source": {"bytes":"live"}
}
Схемата във файл с име so.avsc:
{
"type":"record",
"name":"Event",
"fields":[
{"name":"valid", "type": ["null", "boolean"],"default":null}
, {"name":"source","type": ["null", "bytes"],"default":null}
]
}
Мога лесно да генерирам avro файл със следната команда:
java -jar avro-tools-1.7.6.jar fromjson --schema-file so.avsc so.log
Дотук добре. Работата е там, че "източник" не е задължителен, така че бих очаквал следните данни също да са валидни:
{
"valid": {"boolean":true}
}
Но изпълнението на същата команда ми дава грешката:
Exception in thread "main" org.apache.avro.AvroTypeException: Expected start-union. Got END_OBJECT
at org.apache.avro.io.JsonDecoder.error(JsonDecoder.java:697)
at org.apache.avro.io.JsonDecoder.readIndex(JsonDecoder.java:441)
at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:229)
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:206)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155)
at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)
at org.apache.avro.tool.DataFileWriteTool.run(DataFileWriteTool.java:99)
at org.apache.avro.tool.Main.run(Main.java:84)
at org.apache.avro.tool.Main.main(Main.java:73)
Опитах много вариации в схемата, дори неща, които не следват спецификацията на avro. Схемата, която показвам тук, е, доколкото знам, това, което спецификацията казва, че трябва да бъде.
Някой знае ли какво правя погрешно и как всъщност мога да имам незадължителни елементи, без да напиша собствен сериализатор?
Благодаря,