【问题标题】:Why can't avro take the schema from the .avro file?为什么 avro 不能从 .avro 文件中获取模式?
【发布时间】:2019-09-26 09:22:25
【问题描述】:

这是来自 tutorialspoint 的反序列化器。

public class Deserialize {
   public static void main(String args[]) throws Exception{

      //Instantiating the Schema.Parser class.
      Schema schema = new Schema.Parser().parse(new File("/home/Hadoop/Avro/schema/emp.avsc"));
      DatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord>(schema);
      DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(new File("/home/Hadoop/Avro_Work/without_code_gen/mydata.txt"), datumReader);
      GenericRecord emp = null;

      while (dataFileReader.hasNext()) {
         emp = dataFileReader.next(emp);
         System.out.println(emp);
      }
      System.out.println("hello");
   }
}

我的问题是:如果 .avro 文件中已经存在架构,为什么我还必须传递架构?我发现必须提供架构才能解析文件非常不方便。

【问题讨论】:

    标签: java deserialization avro


    【解决方案1】:

    Avro 需要两个架构来解析 - 读取器架构和写入器架构。

    编写器架构包含在文件中。

    可以从文件中解析出架构

    String filepath = ...;
    DataFileReader<Void> reader = new DataFileReader<>(Util.openSeekableFromFS(filepath),
        new GenericDatumReader<>());
    System.out.println(reader.getSchema().toString(true));
    

    这就是java -jar avro-tools.jar getschema 的工作原理

    你可能需要Util.openSeekableFromFS 方法,因为它似乎是包私有的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 2016-08-09
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多