java - java.io.IOException 使用 Avro 工具将 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 文件不匹配。
我已经检查了有关此错误的所有其他 stackoverflow 问题,但没有一个有帮助。我在 Windows 10 PowerShell 上使用了命令行。
有人知道这里到底发生了什么吗?
更新:如果我在 Cloudera VM 上而不是在 Windows 上进行转换,则转换有效。在生成的 Avro 文件中,只有开头的几处不同。
解决方案
找到原因:
Windows 10 PowerShell将二进制流转换为 UTF8 流。更改编码会更改魔术字节,这(正确)会导致引发异常。
它在终端等另一个shell中完美运行。
旁注:PowerShell应用程序可以通过使用管道而不是大于号来强制不更改编码,如下所示:
java -jar .\avro-tools-1.7.7.jar fromjson --schema-file .\data.avsc .\data.json | .\data.avro
推荐阅读
- apache-spark - 从数据块中的 mlflow-registry 加载模型时出现 InvalidMountException
- python - 如何使用 Kivy/Buildozer 在 Android 上请求 ACCESS_SURFACE_FLINGER 权限?
- c# - c# 中 CefSharp DevTool 类中的事件处理程序
- powershell - 通过 PowerShell 创建新用户
- javascript - TypeError:无法使用 Discordjs v12 读取未定义的属性“用户”[已解决]
- ftp - Spring 集成 FTP 低级日志记录
- ios - iOS 14 中不遵守 UIDatePicker 间隔
- nginx - Kubernetes - 一个入口中的多个配置
- javascript - 谷歌 Appscript 使用 for 循环和 if
- sql-server - Power BI 合并来自两个 SQL-Server 表的结果