AVRO - 通过生成类进行序列化


人们可以通过生成与模式对应的类或使用解析器库将 Avro 模式读入程序。本章介绍如何通过生成类并使用 Avr序列化数据来读取模式。

Avro WithCode 序列化

通过生成类进行序列化

要使用 Avro 序列化数据,请按照以下步骤操作 -

  • 编写 Avro 架构。

  • 使用 Avro 实用程序编译架构。您将获得与该模式相对应的 Java 代码。

  • 用数据填充架构。

  • 使用 Avro 库对其进行序列化。

定义模式

假设您想要一个具有以下详细信息的模式 -

场地 姓名 ID 年龄 薪水 地址
类型 细绳 整数 整数 整数 细绳

创建 Avro 架构,如下所示。

将其另存为emp.avsc

{
   "namespace": "tutorialspoint.com",
   "type": "record",
   "name": "emp",
   "fields": [
      {"name": "name", "type": "string"},
      {"name": "id", "type": "int"},
      {"name": "salary", "type": "int"},
      {"name": "age", "type": "int"},
      {"name": "address", "type": "string"}
   ]
}

编译架构

创建 Avro schema 后,您需要使用 Avro 工具编译创建的 schema。 avro-tools-1.7.7.jar是包含工具的 jar。

编译 Avro 架构的语法

java -jar <path/to/avro-tools-1.7.7.jar> compile schema <path/to/schema-file> <destination-folder>

在主文件夹中打开终端。

创建一个新目录以与 Avro 一起使用,如下所示 -

$ mkdir Avro_Work

在新创建的目录中,创建三个子目录 -

  • 首先命名schema,用于放置 schema。

  • 第二个名为with_code_gen,用于放置生成的代码。

  • 第三个名为jars,用于放置 jar 文件。

$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars

以下屏幕截图显示了创建所有目录后Avro_work文件夹的外观。

阿夫罗工作
  • 现在/home/Hadoop/Avro_work/jars/avro-tools-1.7.7.jar是下载 avro-tools-1.7.7.jar 文件的目录路径。

  • /home/Hadoop/Avro_work/schema/是存储架构文件 emp.avsc 的目录路径。

  • /home/Hadoop/Avro_work/with_code_gen是您希望存储生成的类文件的目录。

现在编译架构,如下所示 -

$ java -jar /home/Hadoop/Avro_work/jars/avro-tools-1.7.7.jar compile schema /home/Hadoop/Avro_work/schema/emp.avsc /home/Hadoop/Avro/with_code_gen

编译完成后,会在目标目录中根据 schema 的命名空间创建一个包。在此包中,将创建具有模式名称的 Java 源代码。生成的源代码是给定模式的 Java 代码,可以直接在应用程序中使用。

例如,在本例中,创建了一个名为tutorialspoint的包/文件夹,其中包含另一个名为com的文件夹(因为名称空间是tutorialspoint.com),并且在其中,您可以观察生成的文件emp.java。以下快照显示了emp.java -

示例程序快照

此类对于根据模式创建数据很有用。

生成的类包含 -

  • 默认构造函数和参数化构造函数接受模式的所有变量。
  • 架构中所有变量的 setter 和 getter 方法。
  • Get() 方法返回模式。
  • 构建器方法。

创建和序列化数据

首先,将本项目中使用的生成的java文件复制到当前目录或从其所在目录导入。

现在我们可以编写一个新的 Java 文件并在生成的文件 ( emp )中实例化该类,以将员工数据添加到架构中。

让我们看看使用 apache Avro 根据模式创建数据的过程。

步骤1

实例化生成的emp类。

emp e1=new emp( );

第2步

使用 setter 方法插入第一个员工的数据。例如,我们创建了名为 Omar 的员工的详细信息。

e1.setName("omar");
e1.setAge(21);
e1.setSalary(30000);
e1.setAddress("Hyderabad");
e1.setId(001);

同样,使用 setter 方法填写所有员工详细信息。

步骤3

使用SpecificDatumWriter类创建DatumWriter接口的对象。这会将 Java 对象转换为内存中的序列化格式。以下示例实例化emp类的SpecificDatumWriter类对象。

DatumWriter<emp> empDatumWriter = new SpecificDatumWriter<emp>(emp.class);

步骤4

实例化emp类的DataFileWriter。此类将符合模式的数据序列化记录以及模式本身写入文件中。此类需要DatumWriter对象作为构造函数的参数。

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

步骤5

使用create()方法打开一个新文件来存储与给定模式匹配的数据。此方法需要模式和要存储数据的文件的路径作为参数。

在以下示例中,使用getSchema()方法传递模式,数据文件存储在路径 - /home/Hadoop/Avro/serialized_file/emp.avro 中。

empFileWriter.create(e1.getSchema(),new File("/home/Hadoop/Avro/serialized_file/emp.avro"));

步骤6

使用append()方法将所有创建的记录添加到文件中,如下所示 -

empFileWriter.append(e1);
empFileWriter.append(e2);
empFileWriter.append(e3);

示例 – 通过生成类进行序列化

以下完整程序展示了如何使用 Apache Avro 将数据序列化到文件中 -

import java.io.File;
import java.io.IOException;

import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumWriter;

public class Serialize {
   public static void main(String args[]) throws IOException{
	
      //Instantiating generated emp class
      emp e1=new emp();
	
      //Creating values according the schema
      e1.setName("omar");
      e1.setAge(21);
      e1.setSalary(30000);
      e1.setAddress("Hyderabad");
      e1.setId(001);
	
      emp e2=new emp();
	
      e2.setName("ram");
      e2.setAge(30);
      e2.setSalary(40000);
      e2.setAddress("Hyderabad");
      e2.setId(002);
	
      emp e3=new emp();
	
      e3.setName("robbin");
      e3.setAge(25);
      e3.setSalary(35000);
      e3.setAddress("Hyderabad");
      e3.setId(003);
	
      //Instantiate DatumWriter class
      DatumWriter<emp> empDatumWriter = new SpecificDatumWriter<emp>(emp.class);
      DataFileWriter<emp> empFileWriter = new DataFileWriter<emp>(empDatumWriter);
	
      empFileWriter.create(e1.getSchema(), new File("/home/Hadoop/Avro_Work/with_code_gen/emp.avro"));
	
      empFileWriter.append(e1);
      empFileWriter.append(e2);
      empFileWriter.append(e3);
	
      empFileWriter.close();
	
      System.out.println("data successfully serialized");
   }
}

浏览生成的代码所在的目录。在本例中,位于home/Hadoop/Avro_work/with_code_gen

在终端 -

$ cd home/Hadoop/Avro_work/with_code_gen/

在图形用户界面中 -

生成的代码

现在将上述程序复制并保存在名为Serialize.java的文件中

编译并执行它,如下所示 -

$ javac Serialize.java
$ java Serialize

输出

data successfully serialized

如果验证程序中给出的路径,可以找到生成的序列化文件,如下所示。

生成的序列化文件