Я использую https://github.com/allegro/json-avro-конвертер для преобразования моего json-сообщения в файл avro. После вызова метода convertToAvro я получаю массив байтов: byte[] byteArrayJson. Затем я использую библиотеку commons от 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 в качестве ОС)
вы также можете сделать так avro.apache.org/docs/1.8.2/gettingstartedjava.html
Я просмотрел обе эти ссылки перед публикацией, я использую библиотеку из github, потому что с ней действительно легко играть. Вы можете легко преобразоватьToJson или convertToAvro, но единственное, что я думаю, это то, что я хочу сохранить массив байтов в файле avro. И когда я его сохраняю и пытаюсь преобразовать с помощью avro-tools, это не работает. Я думаю, что у меня есть несколько неправильных байтов, как здесь: stackoverflow.com/questions/51148486/…
Windows 10 PowerShell преобразует двоичный поток в поток UTF8. Изменение кодировки изменяет магические байты, что (правильно) приводит к возникновению исключения. Боковое примечание: приложение PowerShell можно заставить не изменять кодировку, используя канал вместо большего, чем вот так: можете ли вы попробовать это из powershell java -jar .\avro-tools-1.7.7.jar fromjson -- файл-схемы .\data.avsc .\data.json | .\data.avro
Да, это ответ по ссылке, которую я разместил. Но, как я уже упоминал в посте, я использую cmd, поэтому никаких изменений происходить не должно. Но я думаю, что при создании файла что-то идет не так, но ИДК, что
@Agata, могу я спросить, почему вы используете код для записи файла и инструменты JAR для чтения JSON? почему не код?
Легче визуализировать и тестировать с разными json.




После того, как я взглянул на файлы avro, я увидел, что в файле, созданном с помощью avro-tools, есть схема, а в файле, созданном библиотекой из github, нет. Поэтому я не использую метод из библиотеки convertToAvro, а использую convertToGenericDataRecord, а затем создаю свой dataFileWriter и устанавливаю запись (которая была получена после вызова метода convertToGenericDataRecord).
Причина в том, что файл avro не содержит одинаковых данных при создании двумя разными способами, и это ожидаемое поведение.
В качестве теста используйте эту команду для создания файла avro.
java -jar avro-tools-1.8.2.jar fromjson --schema-file avroschema.json
testCheck.json > myFile2.auro
Теперь прочитайте это и распечатайте на Java, и обратите внимание, что оно не содержит ТОЛЬКО ЗАПИСЬ AVRO. Он также содержит scme (по крайней мере) - см. преобразованные данные String ниже. Это означает, что данные в файлах AVRO отличаются при создании с помощью инструментов acro и при использовании конвертера avro.
bjavro.schemaœ{"type":"record","name":"Acme","fields":[{"name":"username","type":"string"}]}avro.c
Проверка в API-интерфейсе инструментов «сбой», когда вы пытаетесь прочитать файл avro, сгенерированный конвертером с помощью команды Тойсон.
Теперь правильная команда для чтения «json» с помощью инструментов acro, когда файл создается с помощью конвертера, — фрагтойсон. Посмотрите, что мы действительно читаем только фрагмент JSON (запись avro здесь)
java -jar avro-tools-1.8.2.jar fragtojson --schema-file avroschema.json myFile.avro > myFile21.json
Еще одна мысль заключается в том, чтобы вообще не использовать инструменты AVRO и создать свой собственный исполняемый файл jar с конвертером в качестве зависимости и использовать его для чтения записей AVRO JSON.
Я не понимаю avro, но проверьте это и скажите, делаете ли вы те же шаги? community.hortonworks.com/questions/32034/…