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



我有一个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文件不匹配,因为开头有几个字符。

我已经检查了有关此错误的所有其他堆栈溢出问题,但没有一个帮助。我在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 文件中,只有开始时的几个咬合是不同的。

找到原因:

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新