AVRO 使用解析器的反序列化


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

本章介绍如何阅读架构 使用解析器库 and 反序列化 使用 Avro 的数据。

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


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

Avro Utility

按照下面给出的过程从文件中反序列化序列化数据。

步骤 1

首先,从文件中读取架构。为此,请使用 模式解析器 班级。该类提供了以不同格式解析模式的方法。

实例化 模式解析器 通过传递存储模式的文件路径来创建类。

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

步骤 2

创建一个对象 基准阅读器 interface using 具体数据读取器 class.

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

步骤 3

实例化 数据文件读取器 班级。此类从文件中读取序列化数据。它需要 基准阅读器 对象,以及序列化数据所在文件的路径,作为构造函数的参数。

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

步骤 4

使用以下方法打印反序列化的数据 数据文件读取器 .

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

  • The 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{
	
        // 实例化 Schema.Parser 类。
        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");
    }
}

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

$ cd home/Hadoop/Avro_work/without_code_gen/

现在将上述程序复制并保存在名为 反序列化.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"}