- Avro 基础
- Avro - 首页
- Avro - 概述
- Avro - 序列化
- Avro - 环境设置
- Avro 架构 & API
- Avro - 架构
- Avro - 参考 API
- 通过生成类来使用 Avro
- 通过生成类进行序列化
- 通过生成类进行反序列化
- 使用解析器库的 Avro
- 使用解析器进行序列化
- 使用解析器进行反序列化
- Avro 有用资源
- Avro - 快速指南
- Avro - 有用资源
- Avro - 讨论
Avro - 使用解析器进行序列化
可以通过生成与架构对应的类或使用解析器库来将 Avro 架构读入程序。在 Avro 中,数据始终与其对应的架构一起存储。因此,我们始终可以在不生成代码的情况下读取架构。
本章介绍如何使用解析器库读取架构以及如何使用 Avro 序列化数据。
使用解析器库进行序列化
要序列化数据,我们需要读取架构,根据架构创建数据,并使用 Avro API 序列化架构。以下过程在不生成任何代码的情况下序列化数据:
步骤 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
如果您验证程序中给定的路径,则可以找到如下所示的生成的序列化文件。