📅  最后修改于: 2020-12-02 05:27:23             🧑  作者: Mango
通过生成对应于模式的类或使用解析器库,可以将Avro模式读入程序。在Avro中,数据始终以其对应的架构存储。因此,我们总是可以在不生成代码的情况下读取模式。
本章介绍如何使用解析器库读取架构以及如何使用Avro序列化数据。
要序列化数据,我们需要读取模式,根据模式创建数据,并使用Avro API序列化模式。以下过程将序列化数据而不生成任何代码-
首先,从文件中读取架构。为此,请使用Schema.Parser类。此类提供了以不同格式解析架构的方法。
通过传递存储模式的文件路径来实例化Schema.Parser类。
Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));
通过实例化GenericData.Record类,创建GenericRecord接口的对象,如下所示。将上面创建的模式对象传递给其构造函数。
GenericRecord e1 = new GenericData.Record(schema);
使用GenericData类的put()方法将值插入架构中。
e1.put("name", "ramu");
e1.put("id", 001);
e1.put("salary",30000);
e1.put("age", 25);
e1.put("address", "chennai");
使用SpecificDatumWriter类创建DatumWriter接口的对象。它将Java对象转换为内存中的序列化格式。以下示例为emp类实例化SpecificDatumWriter类对象-
DatumWriter empDatumWriter = new SpecificDatumWriter(emp.class);
为emp类实例化DataFileWriter 。此类将符合模式的数据的序列化记录以及模式本身写入文件中。此类需要DatumWriter对象作为构造函数的参数。
DataFileWriter dataFileWriter = new DataFileWriter(empDatumWriter);
使用create()方法打开一个新文件,以存储与给定架构匹配的数据。此方法需要模式以及要在其中存储数据的文件的路径作为参数。
在下面给出的示例中,使用getSchema()方法传递架构,并将数据文件存储在路径中
/home/Hadoop/Avro/serialized_file/emp.avro。
empFileWriter.create(e1.getSchema(), new
File("/home/Hadoop/Avro/serialized_file/emp.avro"));
如下所示,使用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 datumWriter = 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
data successfully serialized
如果您验证程序中给出的路径,则可以找到生成的序列化文件,如下所示。