- AVRO 基礎
- AVRO - 首頁
- AVRO - 概述
- AVRO - 序列化
- AVRO - 環境搭建
- AVRO 架構 & API
- AVRO - 架構
- AVRO - 參考 API
- 透過生成類使用 AVRO
- 透過生成類進行序列化
- 透過生成類進行反序列化
- 使用解析器庫的 AVRO
- 使用解析器進行序列化
- 使用解析器進行反序列化
- AVRO 有用資源
- AVRO - 快速指南
- AVRO - 有用資源
- AVRO - 討論
AVRO - 透過生成類進行序列化
可以透過生成與架構相對應的類或使用解析器庫來將 Avro 架構讀入程式。本章描述瞭如何透過生成類並使用 Avro序列化資料。
透過生成類進行序列化
要使用 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資料夾的外觀。
現在/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() 方法。
- 構建器方法。
建立和序列化資料
首先,將本專案中使用的生成 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 中:
現在複製並將上述程式儲存到名為Serialize.java的檔案中。
編譯並執行它,如下所示:
$ javac Serialize.java $ java Serialize
輸出
data successfully serialized
如果您驗證程式中給定的路徑,則可以找到如下所示的生成的序列化檔案。