📅  最后修改于: 2020-12-02 05:26:53             🧑  作者: Mango
如前所述,可以通过生成对应于该模式的类或使用解析器库将Avro模式读入程序。本章介绍如何通过生成类来读取架构以及如何使用Avro反序列化数据。
序列化的数据存储在文件emp.avro中。您可以使用Avro反序列化并阅读它。
请按照下面给出的步骤从文件中反序列化序列化的数据。
使用SpecificDatumReader类创建DatumReader接口的对象。
DatumReaderempDatumReader = new SpecificDatumReader(emp.class);
为emp类实例化DataFileReader 。此类从文件读取序列化的数据。它需要Dataumeader对象以及序列化数据所在的文件的路径,作为构造函数的参数。
DataFileReader dataFileReader = new DataFileReader(new File("/path/to/emp.avro"), empDatumReader);
使用DataFileReader的方法打印反序列化的数据。
如果Reader中有任何元素,则hasNext()方法将返回一个布尔值。
DataFileReader的next()方法在Reader中返回数据。
while(dataFileReader.hasNext()){
em=dataFileReader.next(em);
System.out.println(em);
}
以下完整程序显示了如何使用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 empDatumReader = new SpecificDatumReader(emp.class);
//Instantiating DataFileReader
DataFileReader dataFileReader = new DataFileReader(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
{"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"}