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

时间:2018-07-03 07:07:09

标签: java json avro 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文件不匹配,因为开头有一些字符。

我已经检查了所有其他有关此错误的stackoverflow问题,但没有一个有帮助。我在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文件中是不同的。

1 个答案:

答案 0 :(得分:2)

找到原因:

Windows 10 PowerShell将二进制流转换为UTF8流。更改编码会更改魔术字节,(正确)会导致引发异常。

它可以完美地在另一个外壳(如终端等)中运行。

旁注:PowerShell应用程序可以通过使用管道而不是大于号来强制不更改编码:

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