我正在使用 https://github.com/allegro/json-avro-converter 将我的json消息转换为avro文件。调用 convertToAvro 方法后,我得到一个字节数组:byte[] byteArrayJson。然后我正在使用 Apache 的公共库:
FileUtils.writeByteArrayToFile(myFile.avro, byteArrayJson);
文件已创建。当我尝试将其重新转换为 json 时,请使用:
java -jar avro-tools-1.8.1.jar tojson myFile.avro > testCheck.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.DataFileStream.<init>(DataFileStream.java:84)
at org.apache.avro.tool.DataFileReadTool.run(DataFileReadTool.java:71)
at org.apache.avro.tool.Main.run(Main.java:87)
at org.apache.avro.tool.Main.main(Main.java:76)
我创建了一个 Junit 测试并使用 convertToJson 方法(来自上一个链接)并断言字符串,一切正常。但是对于罐子,它不起作用。我做错了什么吗?我使用的是cmd,而不是powerShell,因为我在SO帖子中看到这可以更改编码。我认为问题出在编码上,但我不知道去哪里看。 (我正在使用Windows作为操作系统)
原因是从这两种不同的方式生成时,avro 文件不包含相同的数据,这是预期的行为。
作为测试,使用此命令生成 avro 文件
java -jar avro-tools-1.8.2.jar fromjson --schema-file avroschema.json
testCheck.json > myFile2.auro
现在阅读本文并在 Java 中打印,并注意它不包含 ONLY AVRO RECORD 它也包含 scme 以及(至少) - 请参阅下面的字符串转换数据。 这意味着AVRO文件中的数据在使用acro工具生成和使用avro转换器时是不同的
bjavro.schemaœ{"type":"record","name":"Acme","fields":[{"name":"username","type":"string"}]}avro.c
当您尝试使用tojson命令读取从转换器生成的 avro 文件时,工具 API 中的验证"失败"。
现在,当使用转换器生成文件时,用于使用 avro 工具读取"json"的正确命令是fragtojson。看到我们真的只读取 JSON 片段(这里有一个 avro 记录)
java -jar avro-tools-1.8.2.jar fragtojson --schema-file avroschema.json myFile.avro > myFile21.json
这里的另一个想法是完全避免使用 AVRO 工具,并使用转换器作为依赖项创建自己的可执行 jar,并使用它来读取 AVRO JSON 记录。
在我查看了 avro 文件之后,我看到使用 avro-tools 创建的文件中有模式,而从 github 创建的库创建的那个没有。所以我不使用库 convertToAvro 中的方法,但我使用 convertToGenericDataRecord,然后创建我自己的 dataFileWriter 并设置记录(这是在调用 convertToGenericDataRecord 方法后获得的)。