📜  AVRO-使用解析器反序列化

📅  最后修改于: 2020-12-02 05:27:47             🧑  作者: Mango


如前所述,可以通过生成与模式相对应的类或使用解析器库将Avro模式读入程序。在Avro中,数据始终以其对应的架构存储。因此,我们始终可以读取序列化的项目而无需生成代码。

本章介绍如何使用解析器库读取架构以及如何使用Avro反序列化数据。

使用解析器库反序列化

序列化的数据存储在文件mydata.txt中。您可以使用Avro反序列化并阅读它。

Avro实用程序

请按照下面给出的步骤从文件中反序列化序列化的数据。

第1步

首先,从文件中读取架构。为此,请使用Schema.Parser类。此类提供了以不同格式解析架构的方法。

通过传递存储模式的文件路径来实例化Schema.Parser类。

Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));

第2步

使用SpecificDatumReader类创建DatumReader接口的对象。

DatumReaderempDatumReader = new SpecificDatumReader(emp.class);

第三步

实例化DataFileReader类。此类从文件读取序列化的数据。它需要DatumReader对象以及序列化数据所在的文件的路径作为构造函数的参数。

DataFileReader dataFileReader = new DataFileReader(new File("/path/to/mydata.txt"), datumReader);

第4步

使用DataFileReader的方法打印反序列化的数据。

  • 如果Reader中有任何元素,则hasNext()方法将返回一个布尔值。

  • DataFileReadernext()方法在Reader中返回数据。

while(dataFileReader.hasNext()){

   em=dataFileReader.next(em);
   System.out.println(em);
}

示例–使用解析器库反序列化

以下完整程序显示了如何使用解析器库反序列化序列化的数据-

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 datumReader = new GenericDatumReader(schema);
      DataFileReader dataFileReader = new DataFileReader(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");
   }
}

浏览到放置生成的代码的目录。在这种情况下,它位于home / Hadoop / Avro_work / without_code_gen

$ cd home/Hadoop/Avro_work/without_code_gen/

现在,将上述程序复制并保存到名为DeSerialize.java的文件中。如下所示编译并执行-

$ javac Deserialize.java
$ java Deserialize

输出

{"name": "ramu", "id": 1, "salary": 30000, "age": 25, "address": "chennai"}
{"name": "rahman", "id": 2, "salary": 35000, "age": 30, "address": "Delhi"}