【问题标题】:Avro - java.io.IOException: Not a data fileAvro - java.io.IOException:不是数据文件
【发布时间】:2019-06-12 06:47:58
【问题描述】:

我正在使用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 作为操作系统)

【问题讨论】:

  • 我不懂 avro,但请检查一下并告诉我您是否遵循相同的步骤? community.hortonworks.com/questions/32034/…
  • 我在发布之前查看了这两个链接,我使用的是来自 github 的库,因为它真的很容易玩。您可以很容易地 convertToJson 或 convertToAvro,但唯一的想法是我想将字节数组存储到 avro 文件中。当我存储它并尝试使用 avro-tools 转换它时不起作用。我想我有一些错误的字节,因为它在这里:stackoverflow.com/questions/51148486/…
  • Windows 10 PowerShell 将二进制流转换为 UTF8 流。更改编码会更改魔术字节,这(正确)会导致引发异常。旁注:PowerShell应用程序可以通过使用管道而不是大于这样来强制不更改编码:你可以从powershell java -jar .\avro-tools-1.7.7.jar fromjson -模式文件 .\data.avsc .\data.json | .\data.avro
  • 是的,这是我发布的链接的答案。但正如我在帖子中提到的,我使用的是 cmd,所以不应该发生任何变化。但是我认为创建文件时出了点问题,但是 IDK 什么

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


【解决方案1】:

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

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

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

现在阅读本文并用 Java 打印,注意它不只包含 AVRO RECORD 它也包含 scme(至少) - 请参阅下面的字符串转换数据。 这意味着 AVRO 文件中的数据在使用 acro 工具生成时和使用 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 记录。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      相关资源
      最近更新 更多