Как исправить ожидаемый старт-Союз. Получил значение NUMBER INT при преобразовании JSON в Avro в командной строке?
Я пытаюсь проверить файл JSON с помощью схемы Avro и написать соответствующий файл Avro. Во-первых, я определил следующую схему Avro с именем user.avsc
:
{"namespace": "example.avro",
"type": "record",
"name": "user",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "type": ["int", "null"]},
{"name": "favorite_color", "type": ["string", "null"]}
]
}
тут :
{"name": "Alyssa", "favorite_number": 256, "favorite_color": null}
а потом попытался бежать:
java -jar ~/bin/avro-tools-1.7.7.jar fromjson --schema-file user.avsc user.json > user.avro
но я получаю следующее исключение:
Exception in thread "main" org.apache.avro.AvroTypeException: Expected start-union. Got VALUE_NUMBER_INT
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:290)
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267)
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)
Я что-то пропустила? Почему я получаю "ожидаемый старт-Союз". Got VALUE_NUMBER_INT".
2 ответов
по данным объяснение Дугом резки,
кодировка JSON Avro требует, чтобы значения ненулевого объединения были помечены с их предполагаемым типом. Это потому, что союзы, как ["байты", "строка"] и ["int"," long"] неоднозначны в JSON, первом оба кодируются как строки JSON, а второй кодируется как формат JSON числа.
http://avro.apache.org/docs/current/spec.html#json_encoding
таким образом, ваша запись должна быть закодирована как:
{"name": "Alyssa", "favorite_number": {"int": 7}, "favorite_color": null}
в работах есть новый кодировщик JSON, который должен решить эту общую проблему: