这是来自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文件中已经有一个架构,为什么还必须传递该架构?我发现必须提供架构以解析文件非常不便。

最佳答案

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方法,因为它似乎是包私有的

关于java - 为什么avro无法从.avro文件中获取架构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58113557/

10-13 03:27