文档结构  
可译网翻译有奖活动正在进行中,查看详情 现在前往 注册?
原作者:tutorialspoint.com    来源:www.tutorialspoint.com [英文]
卓小混混    计算机    2017-01-08    0评/185阅
翻译进度:83%   参与翻译: 卓小混混 (5)

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

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

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

Avro Without Code Serialize

使用解析库串行化

第 1 段(可获 1.2 积分)

To serialize the data, we need to read the schema, create data according to the schema, and serialize the schema using the Avro API. The following procedure serializes the data without generating any code −

Step 1

First of all, read the schema from the file. To do so, use Schema.Parser class. This class provides methods to parse the schema in different formats.

Instantiate the Schema.Parser class by passing the file path where the schema is stored.

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

Step 2

Create the object of GenericRecord interface, by instantiating GenericData.Record class. This constructor accepts a parameter of type Schema. Pass the schema object created in step 1 to its constructor as shown below −

第 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 积分)

文章评论