Avro 简明教程
AVRO - Serialization Using Parsers
可以通过生成对应于模式的类或使用解析器库将 Avro 模式读入程序中。在 Avro 中,数据始终与相应模式一起存储。因此,我们可以始终在不生成代码的情况下读取模式。
本章介绍如何读取模式 by using parsers library 以及使用 Avro serialize 数据。
Serialization Using Parsers Library
要序列化数据,我们需要读取模式,根据模式创建数据,并使用 Avro API 序列化模式。以下过程在不生成任何代码的情况下对数据进行序列化 −
Step 1
首先,从文件中读取模式。为此,请使用 Schema.Parser 类。此类提供以不同格式解析模式的方法。
通过传递存储模式的文件路径实例化 Schema.Parser 类。
Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));
Step 2
创建 GenericRecord 接口的对象,通过实例化 GenericData.Record 类,如下所示。将上述创建的模式对象传递给构造函数。
GenericRecord e1 = new GenericData.Record(schema);
Step 3
使用 GenericData 类的 put() 方法在模式中插入值。
e1.put("name", "ramu");
e1.put("id", 001);
e1.put("salary",30000);
e1.put("age", 25);
e1.put("address", "chennai");
Step 4
使用 SpecificDatumWriter 类创建 DatumWriter 接口的对象。它将 Java 对象转换为内存中序列化的格式。以下示例为 emp 类实例化 SpecificDatumWriter 类对象 −
DatumWriter<emp> empDatumWriter = new SpecificDatumWriter<emp>(emp.class);
Step 5
为 emp 类实例化 DataFileWriter 。此类将符合模式的数据的序列化记录与模式本身一起写入文件。此类需要 DatumWriter 对象作为构造函数的参数。
DataFileWriter<emp> dataFileWriter = new DataFileWriter<emp>(empDatumWriter);
Example – Serialization Using Parsers
以下完整程序显示了如何使用解析器对数据进行序列化 −
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