AVRO 通过生成类进行序列化


可以通过生成与模式对应的类或使用解析器库将 Avro 模式读入程序。本章介绍如何阅读架构 通过生成一个类 and 序列化 使用 Avr 的数据。

Avro WithCode Serializing

通过生成类进行序列化


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

  • 编写 Avro 架构。

  • 使用 Avro 实用程序编译架构。你得到对应的Java代码 schema.

  • 用数据填充架构。

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

定义模式


假设你想要一个具有以下详细信息的架构:

Field Name id age salary address
type String int int int string

创建一个 Avro 架构,如下所示。

另存为 emp.avsc .

{
    "namespace": "newbiego.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 架构后,你需要使用 Avro 工具编译创建的架构。 avro-tools-1.7.7.jar 是包含工具的 jar。

编译 Avro Schema 的语法

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

在主文件夹中打开终端。

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

$ mkdir Avro_Work

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

  • 首先命名 schema, 放置架构。

  • 第二名 with_code_gen, 放置生成的代码。

  • 第三名 jars, 放置jar文件。

$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars

以下屏幕截图显示了你的 Avro_work 创建所有目录后,文件夹应该看起来像。

Avro Work
  • Now /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 代码,可以直接在应用程序中使用。

例如,在这种情况下,一个包/文件夹,名为 教程点 被创建,其中包含另一个名为 com 的文件夹(因为名称空间是 newbiego.com),你可以在其中观察生成的文件 emp.java .以下快照显示 emp.java

Snapshot of Sample Program

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

生成的类包含:

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

创建和序列化数据


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

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

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

步骤 1

实例化生成的 emp class.

emp e1=new emp( );

步骤 2

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

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

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

步骤 3

创建一个对象 数据写入器 interface using the 具体数据编写者 班级。这会将 Java 对象转换为内存中的序列化格式。以下示例实例化 具体数据编写者 类对象 emp class.

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

步骤 4

实例化 数据文件编写器 for emp 班级。此类将符合模式的数据的序列化记录与模式本身一起写入文件中。这个类需要 数据写入器 对象,作为构造函数的参数。

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

步骤 5

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

在以下示例中,模式是使用传递的 获取架构() 方法,数据文件存放在路径: /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{
	
        // 实例化生成的emp类
        emp e1=new emp();
	
        // 根据模式创建值
        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);
	
        // 实例化 DatumWriter 类
        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");
    }
}

浏览放置生成代码的目录。在这种情况下,在 主页/Hadoop/Avro_work/with_code_gen .

在终端:

$ cd home/Hadoop/Avro_work/with_code_gen/

In GUI:

Generated Code

现在将上述程序复制并保存在名为 序列化.java

编译执行如下图:

$ javac Serialize.java
$ java Serialize
data successfully serialized

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

Generated Serialized File