Avro 简明教程

AVRO - Deserialization By Generating Class

如前所述,可以通过生成与模式相对应的类或通过使用解析器库来读取 Avro 模式到一个程序中。本章介绍了如何使用 Avro 读取模式 by generating a classDeserialize 数据。

Deserialization by Generating a Class

序列化数据存储在文件 emp.avro 中。你可以使用 Avro 序列化并读取它。

serialized data is stored

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

Step 1

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

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

Step 2

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

DataFileReader<emp> dataFileReader = new DataFileReader(new File("/path/to/emp.avro"), empDatumReader);

Step 3

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

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

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

while(dataFileReader.hasNext()){

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

Example – Deserialization by Generating a Class

以下完整程序展示了如何使用 Avro 序列化文件中的数据。

import java.io.File;
import java.io.IOException;

import org.apache.avro.file.DataFileReader;
import org.apache.avro.io.DatumReader;
import org.apache.avro.specific.SpecificDatumReader;

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

      //DeSerializing the objects
      DatumReader<emp> empDatumReader = new SpecificDatumReader<emp>(emp.class);

      //Instantiating DataFileReader
      DataFileReader<emp> dataFileReader = new DataFileReader<emp>(new
         File("/home/Hadoop/Avro_Work/with_code_genfile/emp.avro"), empDatumReader);
      emp em=null;

      while(dataFileReader.hasNext()){

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

浏览到生成代码所在目录。在本例中,在 home/Hadoop/Avro_work/with_code_gen.

$ cd home/Hadoop/Avro_work/with_code_gen/

现在,复制并保存以上程序到名为 DeSerialize.java 的文件中。如下所示,对其进行编译和执行:

$ javac Deserialize.java
$ java Deserialize

Output

{"name": "omar", "id": 1, "salary": 30000, "age": 21, "address": "Hyderabad"}
{"name": "ram", "id": 2, "salary": 40000, "age": 30, "address": "Hyderabad"}
{"name": "robbin", "id": 3, "salary": 35000, "age": 25, "address": "Hyderabad"}