java.io.IOException 使用 Avro 工具将 JSON 转换为 Avro 后不是数据文件

java.io.IOException Not a data file after converting JSON to Avro with Avro Tools

我有一个 JSON 文件和一个 avro 模式文件,它们正确地描述了它的结构。 然后,我使用 Avro 工具将 JSON 文件转换为 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 文件不匹配。

我已经检查了关于此错误的所有其他 Whosebug 问题,但其中 none 有帮助。我在 Windows 10 PowerShell 上使用了命令行。

https://www.michael-noll.com/blog/2013/03/17/reading-and-writing-avro-files-from-the-command-line/#json-to-binary-avro

有人知道这里到底发生了什么吗?

更新: 如果我在 Cloudera VM 上而不是在 Windows 上进行转换,则转换有效。生成的 Avro 文件只有开头的几处不同。

找到原因:

Windows10 PowerShell 将二进制流转换为 UTF8 流。更改编码会更改魔术字节,这(正确地)导致抛出异常。

它在另一个 shell 中完美运行,例如终端等

旁注:可以强制 PowerShell 应用不更改编码,方法是使用管道而不是像这样的大于号:

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