- AVRO 基础知识
- AVRO - 首页
- AVRO - 概述
- AVRO - 序列化
- AVRO - 环境设置
- AVRO 模式 & API
- AVRO - 模式
- AVRO - 参考 API
- 通过生成类使用 AVRO
- 通过生成类进行序列化
- 通过生成类进行反序列化
- 使用解析器库的 AVRO
- 使用解析器进行序列化
- 使用解析器进行反序列化
- AVRO 有用资源
- AVRO - 快速指南
- AVRO - 有用资源
- AVRO - 讨论
AVRO - 使用解析器进行反序列化
如前所述,可以通过生成与模式对应的类或使用解析器库来将 Avro 模式读取到程序中。在 Avro 中,数据始终与其对应的模式一起存储。因此,我们总是可以无需代码生成即可读取序列化项。
本章介绍如何使用**解析器库**读取模式以及如何使用 Avro **反序列化**数据。
使用解析器库进行反序列化
序列化数据存储在文件**mydata.txt**中。您可以使用 Avro 反序列化并读取它。
请按照以下步骤从文件中反序列化序列化数据。
步骤 1
首先,从文件中读取模式。为此,请使用**Schema.Parser**类。此类提供方法以解析不同格式的模式。
通过传递存储模式的文件路径来实例化**Schema.Parser**类。
Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));
步骤 2
使用**SpecificDatumReader**类创建一个**DatumReader**接口的对象。
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**的方法打印反序列化数据。
**hasNext()**方法返回一个布尔值,指示读取器中是否存在任何元素。
**DataFileReader**的**next()**方法返回读取器中的数据。
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<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"}
广告