Avro - 使用解析器進行序列化



可以透過生成與架構對應的類或使用解析器庫來將 Avro 架構讀入程式。在 Avro 中,資料始終與其對應的架構一起儲存。因此,我們始終可以在不生成程式碼的情況下讀取架構。

本章介紹如何使用解析器庫讀取架構以及如何使用 Avro 序列化資料。

Avro Without Code Serialize

使用解析器庫進行序列化

要序列化資料,我們需要讀取架構,根據架構建立資料,並使用 Avro API 序列化架構。以下過程在不生成任何程式碼的情況下序列化資料:

步驟 1

首先,從檔案中讀取架構。為此,請使用Schema.Parser類。此類提供方法以解析不同格式的架構。

透過傳遞儲存架構的檔案路徑來例項化Schema.Parser類。

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

步驟 2

透過例項化GenericData.Record類來建立GenericRecord介面的物件,如下所示。將其建構函式傳遞給上面建立的架構物件。

GenericRecord e1 = new GenericData.Record(schema);

步驟 3

使用GenericData類的put()方法在架構中插入值。

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

步驟 4

使用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/
Without Code Gen

現在將上述程式複製並儲存到名為Serialize.java的檔案中。編譯並執行它,如下所示:

$ javac Serialize.java
$ java Serialize

輸出

data successfully serialized

如果您驗證程式中給定的路徑,則可以找到如下所示的生成的序列化檔案。

Without Code Gen1
廣告

© . All rights reserved.