Avro 简明教程
AVRO - Serialization By Generating Class
可以通过生成与架构图相对应的类或者使用解析器库将 Avro 架构图读入程序。本章介绍了如何使用 Avro 读取架构图 by generating a class 和 Serializing 数据。
Serialization by Generating a Class
若要使用 Avro 序列化数据,请按照以下步骤操作:
-
Write an Avro schema.
-
使用 Avro 实用程序编译架构图。您可以获得与该架构图相对应的 Java 代码。
-
使用数据填充架构图。
-
使用 Avro 库序列化它。
Defining a Schema
假设您想要一个具有以下详细信息的架构图:
Field |
Name |
id |
age |
salary |
address |
type |
String |
int |
int |
int |
string |
创建如下所示的 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"}
]
}
Compiling the Schema
在创建 Avro 架构图后,您需要使用 Avro 工具来编译所创建的架构图。 avro-tools-1.7.7.jar 是包含这些工具的 jar。
Syntax to Compile an Avro Schema
java -jar <path/to/avro-tools-1.7.7.jar> compile schema <path/to/schema-file> <destination-folder>
在 home 文件夹中打开终端。
创建一个新目录以使用 Avro,如下所示:
$ mkdir Avro_Work
在新建目录中,创建三个子目录−
-
首先命名为 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
编译后,根据模式的名称空间在目标目录中创建一个包。在此包中,将创建具有模式名称的 Java 源代码。此生成的源代码是给定模式的 Java 代码,可直接在应用程序中使用。
例如,在此实例中创建了一个名为 tutorialspoint 的包/文件夹,其中包含另一个名为 com 的文件夹(因为名称空间是 tutorialspoint.com),在其中,您可以看到生成的文件 emp.java 。以下快照显示 emp.java −
此类对于根据模式创建数据十分有用。
生成的类包含−
-
默认构造函数和接收模式所有变量的参数化构造函数。
-
模式中所有变量的 setter 和 getter 方法。
-
返回模式的 Get() 方法。
-
Builder methods.
Creating and Serializing the Data
首先,将此项目中使用的已生成 java 文件复制到当前目录中或从其所在位置导入该文件。
现在我们可以编写一个新的 Java 文件并实例化生成文件中 ( emp ) 的类以向模式中添加员工数据。
让我们了解使用 Apache Avro 根据模式创建数据的过程。
Step 2
使用 setter 方法,插入第一个员工的数据。例如,我们已经创建的名为 Omar 的员工的详细信息。
e1.setName("omar");
e1.setAge(21);
e1.setSalary(30000);
e1.setAddress("Hyderabad");
e1.setId(001);
同样,使用 setter 方法填写所有员工详细信息。
Step 3
使用 SpecificDatumWriter 类创建 DatumWriter 接口的对象。这会将 Java 对象转换为内存中的序列化格式。以下示例会为 emp 类实例化 SpecificDatumWriter 类对象。
DatumWriter<emp> empDatumWriter = new SpecificDatumWriter<emp>(emp.class);
Step 4
为 emp 类实例化 DataFileWriter 。该类会连同模式本身将符合模式的数据序列序列化记录写入文件。该类需要 DatumWriter 对象作为构造函数的参数。
DataFileWriter<emp> empFileWriter = new DataFileWriter<emp>(empDatumWriter);
Example – Serialization by Generating a Class
以下完整程序演示如何使用 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 中。
In Terminal −
$ cd home/Hadoop/Avro_work/with_code_gen/
In GUI −
现在将上述程序复制并保存到名为 Serialize.java 的文件中。
按如下所示进行编译并执行:
$ javac Serialize.java
$ java Serialize