AVRO - 使用解析器进行反序列化

如前所述,可以通过生成与模式对应的类或使用解析器库将Avro模式读入程序.在Avro中,数据始终与其对应的模式一起存储.因此,我们总是可以在没有代码生成的情况下读取序列化项目.

本章介绍如何使用解析器库和反序列化>使用Avro的数据.

使用解析器库进行反序列化

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

Avro Utility

关注下面给出的过程从文件中反序列化序列化数据.

步骤1

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

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

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

步骤2

使用 SpecificDatumReader <创建 DatumReader 界面的对象/b> class.

DatumReader<emp>empDatumReader = new SpecificDatumReader<emp>(emp.class);

第3步

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

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

步骤4

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

  • 如果Reader $ b中有任何元素, hasNext()方法返回一个布尔值$ b.

  • DataFileReader next()方法返回Reader中的数据.

while(dataFileReader.hasNext()){

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

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

以下完整程序显示如何反序列化序列化数据使用Parsers库 :

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");
   }
}

浏览生成代码的目录.在这种情况下,它位于 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"}