AVRO - 透過生成類進行序列化



可以透過生成與架構相對應的類或使用解析器庫來將 Avro 架構讀入程式。本章描述瞭如何透過生成類並使用 Avro序列化資料。

Avro WithCode Serializing

透過生成類進行序列化

要使用 Avro 序列化資料,請按照以下步驟操作:

  • 編寫 Avro 架構。

  • 使用 Avro 工具編譯架構。您將獲得與該架構相對應的 Java 程式碼。

  • 使用資料填充架構。

  • 使用 Avro 庫進行序列化。

定義架構

假設您需要一個包含以下詳細資訊的架構:

欄位 名稱 id age salary address
型別 字串 整數 整數 整數 字串

建立如下所示的 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 檔案。

編譯 Avro 架構的語法

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
  • 現在/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

Snapshot of Sample Program

此類可用於根據架構建立資料。

生成的類包含:

  • 預設建構函式和引數化建構函式,它們接受架構的所有變數。
  • 架構中所有變數的 setter 和 getter 方法。
  • 返回架構的 Get() 方法。
  • 構建器方法。

建立和序列化資料

首先,將本專案中使用的生成 Java 檔案複製到當前目錄,或從其所在位置匯入。

現在,我們可以編寫一個新的 Java 檔案並在生成的emp檔案(類)中例項化該類,以將員工資料新增到架構中。

讓我們看看使用 Apache Avro 根據架構建立資料的過程。

步驟 1

例項化生成的emp類。

emp e1=new emp( );

步驟 2

使用 setter 方法插入第一個員工的資料。例如,我們建立了名為 Omar 的員工的詳細資訊。

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

同樣,使用 setter 方法填寫所有員工的詳細資訊。

步驟 3

使用SpecificDatumWriter類建立DatumWriter介面的物件。這會將 Java 物件轉換為記憶體中的序列化格式。以下示例為emp類例項化SpecificDatumWriter類物件。

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

步驟 4

emp類例項化DataFileWriter。此類在檔案中寫入符合架構的資料的序列化記錄序列,以及架構本身。此類需要DatumWriter物件作為建構函式的引數。

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

步驟 5

使用create()方法開啟一個新檔案以儲存與給定架構匹配的資料。此方法需要架構和資料要儲存到的檔案的路徑作為引數。

在以下示例中,使用getSchema()方法傳遞架構,並將資料檔案儲存在路徑/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{
	
      //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

在終端中:

$ cd home/Hadoop/Avro_work/with_code_gen/

在 GUI 中:

Generated Code

現在複製並將上述程式儲存到名為Serialize.java的檔案中。

編譯並執行它,如下所示:

$ javac Serialize.java
$ java Serialize

輸出

data successfully serialized

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

Generated Serialized File
廣告

© . All rights reserved.