如前所述,可以通过生成与模式对应的类或使用解析器库将Avro模式读入程序.本章介绍如何使用Avro生成类和反序列化数据来读取模式.
序列化数据存储在文件 emp.avro 中.您可以使用Avro反序列化并阅读它.
按照下面给出的步骤从文件中反序列化序列化数据.
创建 DatumReader 界面使用 SpecificDatumReader 类.
DatumReader<emp>empDatumReader = new SpecificDatumReader<emp>(emp.class); ;
为 emp 类实例化 DataFileReader .该类从文件中读取序列化数据.它需要 Dataumeader 对象,以及存在序列化数据的文件的路径,作为构造函数的参数.
DataFileReader<emp> 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<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
{"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"}