📅  最后修改于: 2020-12-02 05:26:31             🧑  作者: Mango
通过生成对应于模式的类或使用解析器库,可以将Avro模式读入程序。本章介绍如何通过生成类并使用Avr序列化数据来读取架构。
要使用Avro序列化数据,请执行以下步骤-
编写一个Avro模式。
使用Avro实用程序编译架构。您将获得与该架构相对应的Java代码。
用数据填充架构。
使用Avro库对其进行序列化。
假设您想要具有以下详细信息的架构-
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"}
]
}
创建Avro模式后,您需要使用Avro工具编译创建的模式。 avro-tools-1.7.7.jar是包含工具的jar。
java -jar compile schema
打开主文件夹中的终端。
创建一个新目录以使用Avro,如下所示-
$ mkdir Avro_Work
在新创建的目录中,创建三个子目录-
首先命名架构,以放置架构。
第二个名称为with_code_gen,用于放置生成的代码。
第三个命名的jar,用于放置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-
此类对于根据架构创建数据很有用。
生成的类包含-
首先,将此项目中使用的生成的Java文件复制到当前目录或从其所在位置导入。
现在,我们可以编写一个新的Java文件,并在生成的文件( emp )中实例化该类,以将员工数据添加到架构中。
让我们看看使用apache Avro根据架构创建数据的过程。
实例化生成的emp类。
emp e1=new emp( );
使用setter方法,插入第一位员工的数据。例如,我们创建了名为Omar的员工的详细信息。
e1.setName("omar");
e1.setAge(21);
e1.setSalary(30000);
e1.setAddress("Hyderabad");
e1.setId(001);
同样,使用setter方法填写所有员工详细信息。
使用SpecificDatumWriter类创建DatumWriter接口的对象。这会将Java对象转换为内存中的序列化格式。下面的示例为emp类实例化SpecificDatumWriter类对象。
DatumWriter empDatumWriter = new SpecificDatumWriter(emp.class);
为emp类实例化DataFileWriter 。此类将符合模式的数据以及模式本身写入文件的序列化序列记录。此类需要DatumWriter对象作为构造函数的参数。
DataFileWriter empFileWriter = new DataFileWriter(empDatumWriter);
使用create()方法打开一个新文件,以存储与给定架构匹配的数据。此方法需要模式以及要在其中存储数据的文件的路径作为参数。
在以下示例中,使用getSchema()方法传递架构,并且数据文件存储在路径-/ home/Hadoop/Avro/serialized_file/emp.avro中。
empFileWriter.create(e1.getSchema(),new File("/home/Hadoop/Avro/serialized_file/emp.avro"));
使用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 empDatumWriter = new SpecificDatumWriter(emp.class);
DataFileWriter empFileWriter = new DataFileWriter(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/
在GUI中-
现在将上面的程序复制并保存到名为Serialize.java的文件中
如下所示编译并执行-
$ javac Serialize.java
$ java Serialize
data successfully serialized
如果您验证程序中给出的路径,则可以找到生成的序列化文件,如下所示。