- Avro 基礎
- Avro - 首頁
- Avro - 概述
- Avro - 序列化
- Avro - 環境設定
- Avro 架構 & API
- Avro - 架構
- Avro - 參考 API
- 透過生成類來使用 Avro
- 透過生成類進行序列化
- 透過生成類進行反序列化
- 使用解析器庫的 Avro
- 使用解析器進行序列化
- 使用解析器進行反序列化
- Avro 有用資源
- Avro - 快速指南
- 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
透過例項化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/
現在將上述程式複製並儲存到名為Serialize.java的檔案中。編譯並執行它,如下所示:
$ javac Serialize.java $ java Serialize
輸出
data successfully serialized
如果您驗證程式中給定的路徑,則可以找到如下所示的生成的序列化檔案。