可以通过生成对应于模式的类或使用解析器库将Avro模式读入程序.在Avro中,数据始终与其对应的模式一起存储.因此,我们总是可以在没有代码生成的情况下读取模式.
本章介绍如何使用解析器库和序列化>来读取模式 b>使用Avro的数据.
序列化使用解析器库
要序列化数据,我们需要读取架构,根据架构创建数据,并使用Avro API序列化架构.以下过程序列化数据而不生成任何代码 :
步骤1
首先,从文件中读取架构.为此,请使用 Schema.Parser 类.此类提供了以不同格式解析模式的方法.
通过传递存储模式的文件路径来实例化 Schema.Parser 类.
Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));
步骤2
通过实例化创建 GenericRecord 接口的对象GenericData.Record 类如下所示.将上面创建的模式对象传递给它的构造函数.
GenericRecord e1 = new GenericData.Record(schema);
步骤3
使用 put()方法在架构中插入值 GenericData 类.
e1.put("name", "ramu");e1.put("id", 001);e1.put("salary",30000);e1.put("age", 25);e1.put("address", "chennai");
步骤4
使用 SpecificDatumWriter创建 DatumWriter 接口的对象上课.它将Java对象转换为内存中的序列化格式.以下示例为 emp 类实现 SpecificDatumWriter 类对象 :
DatumWriterempDatumWriter = new SpecificDatumWriter (emp.class);
步骤5
为 emp 类实例化 DataFileWriter .此类将符合模式的数据的序列化记录以及模式本身写入文件中.此类需要 DatumWriter 对象,作为构造函数的参数.
DataFileWriterdataFileWriter = new DataFileWriter (empDatumWriter);
步骤6
使用 create(打开一个新文件来存储与给定模式匹配的数据) )方法.此方法需要架构以及要存储数据的文件的路径作为参数.
在下面给出的示例中,使用 getSchema()传递架构方法和数据文件存储在路径中
/home/Hadoop/Avro/serialized_file/emp.avro.
empFileWriter.create(e1.getSchema(), newFile("/home/Hadoop/Avro/serialized_file/emp.avro"));
第7步
使用追加()将所有创建的记录添加到文件中方法如下所示.
empFileWriter.append(e1);empFileWriter.append(e2);empFileWriter.append(e3);
示例 - 使用解析器序列化
以下完整程序显示如何使用解析器序列化数据 :
import java.io.File;import java.io.IOException;import org.apache.avro.Schema;import org.apache.avro.file.DataFileWriter;import org.apache.avro.generic.GenericData;import org.apache.avro.generic.GenericDatumWriter;import org.apache.avro.generic.GenericRecord;import org.apache.avro.io.DatumWriter;public class Seriali { public static void main(String args[]) throws IOException{ //Instantiating the Schema.Parser class. Schema schema = new Schema.Parser().parse(new File("/home/Hadoop/Avro/schema/emp.avsc")); //Instantiating the GenericRecord class. GenericRecord e1 = new GenericData.Record(schema); //Insert data according to schema e1.put("name", "ramu"); e1.put("id", 001); e1.put("salary",30000); e1.put("age", 25); e1.put("address", "chenni"); GenericRecord e2 = new GenericData.Record(schema); e2.put("name", "rahman"); e2.put("id", 002); e2.put("salary", 35000); e2.put("age", 30); e2.put("address", "Delhi"); DatumWriterdatumWriter = new GenericDatumWriter (schema); DataFileWriter dataFileWriter = new DataFileWriter (datumWriter); dataFileWriter.create(schema, new File("/home/Hadoop/Avro_work/without_code_gen/mydata.txt")); dataFileWriter.append(e1); dataFileWriter.append(e2); dataFileWriter.close(); System.out.println("data successfully serialized"); }}
浏览生成代码的目录.在这种情况下,在 home/Hadoop/Avro_work/without_code_gen .
$ cd home/Hadoop/Avro_work/without_code_gen/
现在将上述程序复制并保存在名为 Serialize.java 的文件中.编译并执行它,如下所示 :
$ javac Serialize.java$ java Serialize
输出
数据成功序列化
如果您验证程序中给出的路径,您可以找到生成的序列化文件,如下所示.