java.io.IOException Не файл данных после преобразования JSON в Avro с помощью Avro Tools - PullRequest
0 голосов
/ 03 июля 2018

У меня есть файл JSON и файл схемы avro, который правильно описывает его структуру. Затем я преобразую файл JSON с помощью инструментов Avro в файл avro, не получая ошибки, например:

java -jar .\avro-tools-1.7.7.jar fromjson --schema-file .\data.avsc .\data.json > .\data.avro

Затем я преобразую сгенерированный файл Avro обратно в JSON, чтобы убедиться, что я получил действительный файл Avro, например:

java -jar .\avro-tools-1.7.7.jar tojson .\data.avro > .\data.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.DataFileReader.<init>(DataFileReader.java:97)
    at org.apache.avro.tool.DataFileGetMetaTool.run(DataFileGetMetaTool.java:64)
    at org.apache.avro.tool.Main.run(Main.java:84)
    at org.apache.avro.tool.Main.main(Main.java:73)

Я получаю то же исключение при выполнении 'getschema' или 'getmeta', а также при использовании avro-tools-1.8.2 или avro-tools-1.7.4. Я также попробовал сделать это с несколькими различными парами данных json и схемы, которые я проверил на достоверность.

Здесь выдается ошибка (в инструментах Avro):

if (!Arrays.equals(DataFileConstants.MAGIC, magic)) {
    throw new IOException("Not a data file.");
}

Кажется, (двоичный) файл Avro не соответствует ожидаемому файлу Avro из-за нескольких символов в начале.

Я проверил все остальные вопросы, касающиеся stackoverflow, относительно этой ошибки, но никто из них не помог Я использовал командную строку в Windows 10 PowerShell.

См. https://www.michael -noll.com / blog / 2013/03/17 / чтение-и-запись-авто-файлов-из-командной строки / # json-to-binary-avro

Кто-нибудь понял, что, черт возьми, здесь происходит?

UPDATE: Преобразование работает, если я делаю это на виртуальной машине Cloudera, а не в Windows. Только несколько укусов в начале отличаются в сгенерированных файлах Avro.

1 Ответ

0 голосов
/ 03 июля 2018

Найдена причина:

Windows PowerShell преобразует двоичный поток в поток UTF8 . Изменение кодировки изменяет магические байты, что (правильно) вызывает исключение.

Отлично работает в другой оболочке, такой как терминал и т. Д.

Примечание: приложение PowerShell может быть вынуждено не изменять кодировку, используя канал, а не больше, чем, например:

java -jar .\avro-tools-1.7.7.jar fromjson --schema-file .\data.avsc .\data.json | .\data.avro
...