- AVRO 基礎知識
- AVRO - 首頁
- AVRO - 概述
- AVRO - 序列化
- AVRO - 環境設定
- AVRO 模式 & API
- AVRO - 模式
- AVRO - 參考 API
- 透過生成類使用 AVRO
- 透過生成類進行序列化
- 透過生成類進行反序列化
- 使用解析器庫的 AVRO
- 使用解析器進行序列化
- 使用解析器進行反序列化
- AVRO 有用資源
- AVRO - 快速指南
- AVRO - 有用資源
- AVRO - 討論
AVRO - 使用解析器進行反序列化
如前所述,可以透過生成與模式對應的類或使用解析器庫來將 Avro 模式讀取到程式中。在 Avro 中,資料始終與其對應的模式一起儲存。因此,我們總是可以無需程式碼生成即可讀取序列化項。
本章介紹如何使用**解析器庫**讀取模式以及如何使用 Avro **反序列化**資料。
使用解析器庫進行反序列化
序列化資料儲存在檔案**mydata.txt**中。您可以使用 Avro 反序列化並讀取它。
請按照以下步驟從檔案中反序列化序列化資料。
步驟 1
首先,從檔案中讀取模式。為此,請使用**Schema.Parser**類。此類提供方法以解析不同格式的模式。
透過傳遞儲存模式的檔案路徑來例項化**Schema.Parser**類。
Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));
步驟 2
使用**SpecificDatumReader**類建立一個**DatumReader**介面的物件。
DatumReader<emp>empDatumReader = new SpecificDatumReader<emp>(emp.class);
步驟 3
例項化**DataFileReader**類。此類從檔案中讀取序列化資料。它需要**DatumReader**物件和儲存序列化資料的檔案的路徑作為建構函式的引數。
DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(new File("/path/to/mydata.txt"), datumReader);
步驟 4
使用**DataFileReader**的方法列印反序列化資料。
**hasNext()**方法返回一個布林值,指示讀取器中是否存在任何元素。
**DataFileReader**的**next()**方法返回讀取器中的資料。
while(dataFileReader.hasNext()){
em=dataFileReader.next(em);
System.out.println(em);
}
示例 – 使用解析器庫進行反序列化
以下完整程式展示瞭如何使用解析器庫反序列化序列化資料:
public class Deserialize {
public static void main(String args[]) throws Exception{
//Instantiating the Schema.Parser class.
Schema schema = new Schema.Parser().parse(new File("/home/Hadoop/Avro/schema/emp.avsc"));
DatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord>(schema);
DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(new File("/home/Hadoop/Avro_Work/without_code_gen/mydata.txt"), datumReader);
GenericRecord emp = null;
while (dataFileReader.hasNext()) {
emp = dataFileReader.next(emp);
System.out.println(emp);
}
System.out.println("hello");
}
}
瀏覽到放置生成程式碼的目錄。在本例中,它位於**home/Hadoop/Avro_work/without_code_gen**。
$ cd home/Hadoop/Avro_work/without_code_gen/
現在將上述程式複製並儲存到名為**DeSerialize.java**的檔案中。編譯並執行它,如下所示:
$ javac Deserialize.java $ java Deserialize
輸出
{"name": "ramu", "id": 1, "salary": 30000, "age": 25, "address": "chennai"}
{"name": "rahman", "id": 2, "salary": 35000, "age": 30, "address": "Delhi"}
廣告