- AVRO Schemas & APIs
- AVRO - Schemas
- AVRO - Reference API
- AVRO By Generating a Class
- Serialization by Generating Class
- Deserialization by Generating Class
- AVRO Using Parsers Library
- Serialization Using Parsers
- Deserialization Using Parsers
- AVRO Useful Resources
- AVRO - Quick Guide
- AVRO - Useful Resources
- AVRO - Discussion
AVRO - 使用解析器进行序列化
人们可以通过生成与模式对应的类或使用解析器库将 Avro 模式读入程序。在 Avro 中,数据始终与其相应的模式一起存储。因此,我们总是可以读取模式而无需生成代码。
本章介绍如何使用解析器库读取模式并使用 Avro序列化数据。
使用解析器库进行序列化
为了序列化数据,我们需要读取 schema,根据 schema 创建数据,并使用 Avro API 序列化 schema。以下过程序列化数据而不生成任何代码 -
步骤1
首先,从文件中读取架构。为此,请使用Schema.Parser类。此类提供了解析不同格式模式的方法。
通过传递存储架构的文件路径来实例化Schema.Parser类。
Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));
第2步
通过实例化GenericData.Record类来创建GenericRecord接口的对象,如下所示。将上面创建的模式对象传递给其构造函数。
GenericRecord e1 = new GenericData.Record(schema);
步骤3
使用GenericData类的put()方法将值插入架构中。
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类对象-
DatumWriter<emp> empDatumWriter = new SpecificDatumWriter<emp>(emp.class);
步骤5
实例化emp类的DataFileWriter。此类将符合模式的数据的序列化记录以及模式本身写入文件中。此类需要DatumWriter对象作为构造函数的参数。
DataFileWriter<emp> dataFileWriter = new DataFileWriter<emp>(empDatumWriter);
步骤6
使用create()方法打开一个新文件来存储与给定模式匹配的数据。此方法需要模式和要存储数据的文件的路径作为参数。
在下面给出的示例中,使用getSchema()方法传递模式,并将数据文件存储在路径中
/home/Hadoop/Avro/serialized_file/emp.avro。
empFileWriter.create(e1.getSchema(), new File("/home/Hadoop/Avro/serialized_file/emp.avro"));
步骤7
使用append()方法将所有创建的记录添加到文件中,如下所示。
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"); DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema); DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(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
输出
data successfully serialized
如果验证程序中给出的路径,可以找到生成的序列化文件,如下所示。