AVRO – 使用解析器的序列化

AVRO – 使用解析器的序列化


通过生成与模式对应的类或使用解析器库,可以将 Avro 模式读入程序。在 Avro 中,数据始终与其对应的架构一起存储。因此,我们始终可以在不生成代码的情况下读取模式。

本章介绍如何使用解析器库读取模式使用 Avro序列化数据。

Avro 无代码序列化

使用解析器库进行序列化

要序列化数据,我们需要读取模式,根据模式创建数据,并使用 Avro API 序列化模式。以下过程序列化数据而不生成任何代码 –

步骤1

首先,从文件中读取模式。为此,请使用Schema.Parser类。此类提供了以不同格式解析模式的方法。

通过传递存储架构的文件路径来实例化Schema.Parser类。

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

第2步

创建GenericRecord接口的对象,通过实例化GenericData.Record类,如下所示。将上面创建的架构对象传递给它的构造函数。

GenericRecord e1 = new GenericData.Record(schema);

第 3 步

使用GenericDataput()方法在模式中插入值

e1.put("name", "ramu");
e1.put("id", 001);
e1.put("salary",30000);
e1.put("age", 25);
e1.put("address", "chennai");

第四步

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

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

第 5 步

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

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

第 6 步

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

在下面给出的示例中,使用getSchema()方法传递架构,并将数据文件存储在路径中

/home/Hadoop/Avro/serialized_file/emp.avro。

empFileWriter.create(e1.getSchema(), new
File("/home/Hadoop/Avro/serialized_file/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”);
   }
}

浏览到放置生成代码的目录。在这种情况下,在home/Hadoop/Avro_work/without_code_gen

$ cd home/Hadoop/Avro_work/without_code_gen/

没有代码生成

现在将上述程序复制并保存在名为Serialize.java的文件中编译并执行它,如下所示 –

$ javac Serialize.java
$ java Serialize

输出

data successfully serialized

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

无代码 Gen1

觉得文章有用?

点个广告表达一下你的爱意吧 !😁