Avro - java.io.IOException: не файл данных

Я использую 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, но проверьте это и скажите, делаете ли вы те же шаги? community.hortonworks.com/questions/32034/…

Justin Tamblyn 12.06.2019 08:56

вы также можете сделать так avro.apache.org/docs/1.8.2/gettingstartedjava.html

Mak 12.06.2019 09:00

Я просмотрел обе эти ссылки перед публикацией, я использую библиотеку из github, потому что с ней действительно легко играть. Вы можете легко преобразоватьToJson или convertToAvro, но единственное, что я думаю, это то, что я хочу сохранить массив байтов в файле avro. И когда я его сохраняю и пытаюсь преобразовать с помощью avro-tools, это не работает. Я думаю, что у меня есть несколько неправильных байтов, как здесь: stackoverflow.com/questions/51148486/…

agata 12.06.2019 09:04

Windows 10 PowerShell преобразует двоичный поток в поток UTF8. Изменение кодировки изменяет магические байты, что (правильно) приводит к возникновению исключения. Боковое примечание: приложение PowerShell можно заставить не изменять кодировку, используя канал вместо большего, чем вот так: можете ли вы попробовать это из powershell java -jar .\avro-tools-1.7.7.jar fromjson -- файл-схемы .\data.avsc .\data.json | .\data.avro

Mak 12.06.2019 09:06

Да, это ответ по ссылке, которую я разместил. Но, как я уже упоминал в посте, я использую cmd, поэтому никаких изменений происходить не должно. Но я думаю, что при создании файла что-то идет не так, но ИДК, что

agata 12.06.2019 09:08

@Agata, могу я спросить, почему вы используете код для записи файла и инструменты JAR для чтения JSON? почему не код?

TechFree 12.06.2019 10:10

Легче визуализировать и тестировать с разными json.

agata 12.06.2019 10:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
4 055
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

После того, как я взглянул на файлы 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.

Другие вопросы по теме