【问题标题】:Reading an Avro file from scala从 scala 读取 Avro 文件
【发布时间】:2015-09-28 09:06:49
【问题描述】:

我正在尝试使用 scala 读取 avro 文件。

我已经使用 avro-tools 提取了文件的架构并将其保存到一个文件中,然后我尝试使用以下代码读取它:

 val zibi= scala.io.Source.fromFile("/home/wasabi/schema").mkString
 val schema_obj =  new Schema.Parser
 val schema2 = schema_obj.parse(zibi)
 val READER2 = new GenericDatumReader[GenericRecord](schema2)
 val myFile = Files.readAllBytes(Paths.get("/tmp/check/CMRF_80_1442744555901-1_1_2_1_1_1_4_10_1.avro"))

 val datum = READER2.read(null, DecoderFactory.defaultFactory.createBinaryDecoder(myFile,null))

但我一直这样打 IOExceptions:

java.io.IOException: Invalid int encoding
        at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:145)
        at org.apache.avro.io.ValidatingDecoder.readInt(ValidatingDecoder.java:83)
        at org.apache.avro.generic.GenericDatumReader.readInt(GenericDatumReader.java:444)
        at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:159)
        at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
        at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
        at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
        at org.apache.avro.generic.GenericDatumReader.readArray(GenericDatumReader.java:219)
        at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
        at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
        at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
        at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
        at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)

当我通过 avro-tools 读取文件时,它读取得很好。

我做错了什么?

【问题讨论】:

  • 您是否检查了以下内容:issues.apache.org/jira/browse/AVRO-1650(这似乎与您的问题非常相似,建议的解决方案可能对您有用。)
  • 嗨,是的,我看到了。我没有转换成字符串或从字符串转换,所以我认为它不相关(除非 readAllBytes 有某种编码配置)。只是为了确保我尝试使用建议的编码将其作为字符串读取,但也失败了。谢谢

标签: scala avro


【解决方案1】:

尝试使用DataFileReader 而不是BinaryDecoder

虽然编码器/解码器用于写入和读取原始 avros,但我怀疑它们会阻塞在 avro 数据文件中找到的标头信息。

import org.apache.avro.generic.{ GenericDatumReader, GenericRecord }
import org.apache.avro.file.DataFileReader

val zibi= scala.io.Source.fromFile("/home/wasabi/schema").mkString
val schema_obj =  new Schema.Parser
val schema2 = schema_obj.parse(zibi)
val READER2 = new GenericDatumReader[GenericRecord](schema2)

val myFile = new File("/tmp/check/CMRF_80_1442744555901-1_1_2_1_1_1_4_10_1.avro")
val dataFileReader = new DataFileReader[GenericRecord](myFile, READER2)
val datum = dataFileReader.next()

【讨论】:

    猜你喜欢
    • 2020-02-26
    • 2022-01-08
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多