Avro - java.io.IOException: не файл данных - PullRequest
1 голос
/ 12 июня 2019

Я использую https://github.com/allegro/json-avro-converter для преобразования моего сообщения json в файл avro.После вызова метода convertToAvro я получаю байтовый массив: byte [] byteArrayJson.Затем я использую библиотеку общин от Apache:

FileUtils.writeByteArrayToFile(myFile.avro, byteArrayJson);

Файл создан.Когда я пытаюсь преобразовать его в json, используя:

java -jar avro-tools-1.8.1.jar tojson myFile.avro > testCheck.json


Exception in thread "main" java.io.IOException: Not a data file.
    at 
org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:105)
    at org.apache.avro.file.DataFileStream.<init>(DataFileStream.java:84)
    at org.apache.avro.tool.DataFileReadTool.run(DataFileReadTool.java:71)
    at org.apache.avro.tool.Main.run(Main.java:87)
    at org.apache.avro.tool.Main.main(Main.java:76)

, я создал тест Junit и использовал метод convertToJson (из предыдущей ссылки) и утверждаю строки, и все в порядке.Но с банкой это не работает.Я делаю что-то неправильно?Я использую cmd, а не powerShell, потому что я видел в SO сообщении, что это может изменить кодировку.Я думаю, что проблема с кодировкой, но я не знаю, где искать.(Я использую Windows в качестве ОС)

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Причина в том, что файл avro не содержит одинаковых данных, если они получены этими двумя различными способами, и это ожидаемое поведение.

В качестве теста используйте эту команду для создания файла avro

java -jar avro-tools-1.8.2.jar fromjson  --schema-file avroschema.json
testCheck.json > myFile2.auro

Теперь прочитайте это и напечатайте на Java, и обратите внимание, что он не содержит ТОЛЬКО AVRO RECORD Он также содержит scme (как минимум) - см. Приведенные ниже строковые данные. Это означает, что данные в файлах AVRO отличаются при генерировании с использованием инструментов acro и при использовании avro converter

bjavro.schemaœ{"type":"record","name":"Acme","fields":[{"name":"username","type":"string"}]}avro.c

Проверка в API инструментов завершается неудачно, когда вы пытаетесь прочитать avro-файл, сгенерированный из конвертера с помощью команды tojson .

Теперь правильная команда для чтения «json» с помощью инструментов acro, когда файл генерируется с помощью конвертера, - fragtojson . Обратите внимание, что мы на самом деле читаем только фрагмент JSON (здесь записана авро)

java -jar avro-tools-1.8.2.jar fragtojson --schema-file avroschema.json myFile.avro > myFile21.json

Еще одна мысль здесь - избегать использования инструментов AVRO в целом и создать свой собственный исполняемый файл jar с конвертером в качестве зависимости, и использовать его для чтения записей AVRO JSON.

0 голосов
/ 12 июня 2019

После того, как я посмотрел на файлы avro, я увидел, что файл, созданный с помощью инструментов avro-tools, содержит схему, а файл, созданный библиотекой из github, - нет.Поэтому я не использую метод из библиотеки convertToAvro, но использую convertToGenericDataRecord, а затем создаю свой собственный dataFileWriter и устанавливаю запись (которая была получена после вызова метода convertToGenericDataRecord).

...