Avro 简明教程

AVRO - Deserialization Using Parsers

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

本章描述了如何使用 Avro 读取模式 using parsers libraryDeserializing 数据。

Deserialization Using Parsers Library

序列化数据存储在文件 mydata.txt 中。你可以使用 Avro 反序列化和读取它。

avro utility

按照以下步骤从文件中序列化序列化数据。

Step 1

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

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

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

Step 2

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

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

Step 3

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

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

Step 4

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

  1. 如果 Reader 中有任何元素, DataFileReader 方法将返回布尔值。

  2. DataFileReadernext() 方法返回 Reader 中的数据。

while(dataFileReader.hasNext()){

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

Example – Deserialization Using Parsers Library

以下完整程序展示了如何使用解析器库序列化序列化数据:

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

Output

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