Avro-java.io.IOException:不是数据文件

时间:2019-06-12 06:47:58

标签: java spring-boot gradle avro avro-tools

我正在使用https://github.com/allegro/json-avro-converter将json消息转换为avro文件。调用convertToAvro方法后,我得到一个字节数组:byte [] byteArrayJson。然后,我使用Apache的commons库:

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作为操作系统)

2 个答案:

答案 0 :(得分:1)

原因是,从这两种不同方式生成的avro文件中不包含相同的数据,这是预期的行为。

作为测试,请使用此命令生成avro文件

java -jar avro-tools-1.8.2.jar fromjson  --schema-file avroschema.json
testCheck.json > myFile2.auro

现在阅读此内容并用Java打印,请注意它不包含仅AVRO RECORD 它还至少包含scme-请参阅下面的String转换数据。 这意味着使用acro工具生成和使用avro转换器时,AVRO文件中的数据是不同的

bjavro.schemaœ{"type":"record","name":"Acme","fields":[{"name":"username","type":"string"}]}avro.c

当您尝试使用 tojson 命令读取从转换器生成的avro文件时,工具API中的验证“失败”。

现在,使用转换器生成文件时,使用Acro工具读取“ 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记录。

答案 1 :(得分:0)

查看avro文件后,我发现使用avro-tools创建的文件中包含架构,而从github的库创建的文件中则没有架构。因此,我不使用来自convertToAvro库的方法,而是使用convertToGenericDataRecord,然后创建自己的dataFileWriter并设置记录(在调用convertToGenericDataRecord方法后获得)。