文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

我们既可以通过生成相应类来读取 Avro schema 表,也可以使用解析类。在 Avro 中数据总是按相应的 schema 表存储的。因此我们不生成代码便可以读取一个 schema 表。

这节阐述了 Avro 中如何使用解析库读取 schema 表并串行化数据。

如下是 Avro 中使用解析库串行化数据的示意图,这里的 emp.avsc 是一个需要传给 Avro 的 schema 文件。

Avro Without Code Serialize

使用解析库串行化

第 1 段(可获 1.2 积分)

为了序列化数据,我们需要读取模型,并根据模型来创建数据,并使用 Avro API 序列化模型。下列的过程在不需要生成任何代码的情况下对数据进行序列化。

第一步

首先,使用 Schema.Parser 从文件读取模型。这个类提供了解析不同格式的模型的方法。

实例化 Schema.Parser 类,并传递存储模型的文件路径:

Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));

第二步

通过初始化 GenericData.Record 类来创建一个 GenericRecord 接口的实例。这个构造函数接受一个 Schema 的参数。传递模型对象给这个构造函数,如下所示:

第 2 段(可获 1.41 积分)
GenericRecord e1 = new GenericData.Record(schema);

步骤 3

使用  GenericData 类的 put() 方法向 schem 插入值。

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

第 3 段(可获 0.58 积分)

emp 类实例化一个 DataFileWriter。这个类会遵循 schema 将数据的序列化记录写入到文件中,同时其自身信息也会写入。这个类需要一个 DatumWriter 对象作为其构造函数的参数。

DataFileWriter<emp> dataFileWriter = new DataFileWriter<emp>(empDatumWriter);

步骤 6

使用  create() 方法打开一个新文件存储匹配 schema 的数据,该方法需要如下两个参数:

  • schema 对象,
  • 数据文件路径。

在如下例子中,由 getSchema() 方法传入 schema 对象且串行化数据存储在 emp.avro 文件中。

第 4 段(可获 1.16 积分)
empFileWriter.create(e1.getSchema(), new File("/path/to/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”);
   }
}
第 5 段(可获 0.4 积分)

浏览生成代码的文件夹,在此例是在 home/Hadoop/Avro_work/without_code_gen

$ cd home/Hadoop/Avro_work/without_code_gen/

Without Code Gen

现在将如上代码复制并保存 Serialize.java 文件中,按如下方式编译执行

$ javac Serialize.java
$ java Serialize

输出

data successfully serialized

如果你验证程序中的路径,你可以发现如下生成的序列化文件

Without Code Gen1

第 6 段(可获 0.8 积分)

文章评论