Java实现数据序列化工具Avro的例子
生活随笔
收集整理的這篇文章主要介紹了
Java实现数据序列化工具Avro的例子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、Avro簡介
Avro是一個數據序列化的系統。
它可以提供:
1)豐富的數據結構類型
2)快速可壓縮的二進制數據形式
3)存儲持久數據的文件容器
4)遠程過程調用RPC
5)簡單的動態語言結合功能,Avro和動態語言結合后,讀寫數據文件和使用RPC協議都不需要生成代碼,而代碼生成作為一種可選的優化只值得在靜態類型語言中實現。
Avro依賴于模式(Schema)。Avro數據的讀寫操作是很頻繁的,而這些操作都需要使用模式,這樣就減少寫入每個數據資料的開銷,使得序列化快速而又輕巧。這種數據及其模式的自我描述方便于動態腳本語言的使用。
當Avro數據存儲到文件中時,它的模式也隨之存儲,這樣任何程序都可以對文件進行處理。如果需要以不同的模式讀取數據,這也很容易解決,因為兩個模式都是已知的。
當在RPC中使用Avro時,服務器和客戶端可以在握手連接時交換模式。服務器和客戶端有著彼此全部的模式,因此相同命名字段、缺失字段和多余字段等信息之間通信中需要解決的一致性問題就可以容易解決
還有,Avro模式是用JSON(一種輕量級的數據交換模式)定義的,這樣對于已經擁有JSON庫的語言可以容易實現。
Avro提供著與諸如Thrift和Protocol Buffers等系統相似的功能,但是在一些基礎方面還是有區別的,主要是:
1)動態類型:Avro并不需要生成代碼,模式和數據存放在一起,而模式使得整個數據的處理過程并不生成代碼、靜態數據類型等等。這方便了數據處理系統和語言的構造。
2)未標記的數據:由于讀取數據的時候模式是已知的,那么需要和數據一起編碼的類型信息就很少了,這樣序列化的規模也就小了。
3)不需要用戶指定字段號:即使模式改變,處理數據時新舊模式都是已知的,所以通過使用字段名稱可以解決差異問題。
2、Java例子
1)下載avro jar包:
? ?下載地址 http://www.trieuvan.com/apache/avro/avro-1.8.1/java/
? ?下載avro-1.8.1.jar and avro-tools-1.8.1.jar兩個jar包,引入工程;
Avro是一個數據序列化的系統。
它可以提供:
1)豐富的數據結構類型
2)快速可壓縮的二進制數據形式
3)存儲持久數據的文件容器
4)遠程過程調用RPC
5)簡單的動態語言結合功能,Avro和動態語言結合后,讀寫數據文件和使用RPC協議都不需要生成代碼,而代碼生成作為一種可選的優化只值得在靜態類型語言中實現。
Avro依賴于模式(Schema)。Avro數據的讀寫操作是很頻繁的,而這些操作都需要使用模式,這樣就減少寫入每個數據資料的開銷,使得序列化快速而又輕巧。這種數據及其模式的自我描述方便于動態腳本語言的使用。
當Avro數據存儲到文件中時,它的模式也隨之存儲,這樣任何程序都可以對文件進行處理。如果需要以不同的模式讀取數據,這也很容易解決,因為兩個模式都是已知的。
當在RPC中使用Avro時,服務器和客戶端可以在握手連接時交換模式。服務器和客戶端有著彼此全部的模式,因此相同命名字段、缺失字段和多余字段等信息之間通信中需要解決的一致性問題就可以容易解決
還有,Avro模式是用JSON(一種輕量級的數據交換模式)定義的,這樣對于已經擁有JSON庫的語言可以容易實現。
Avro提供著與諸如Thrift和Protocol Buffers等系統相似的功能,但是在一些基礎方面還是有區別的,主要是:
1)動態類型:Avro并不需要生成代碼,模式和數據存放在一起,而模式使得整個數據的處理過程并不生成代碼、靜態數據類型等等。這方便了數據處理系統和語言的構造。
2)未標記的數據:由于讀取數據的時候模式是已知的,那么需要和數據一起編碼的類型信息就很少了,這樣序列化的規模也就小了。
3)不需要用戶指定字段號:即使模式改變,處理數據時新舊模式都是已知的,所以通過使用字段名稱可以解決差異問題。
2、Java例子
1)下載avro jar包:
? ?下載地址 http://www.trieuvan.com/apache/avro/avro-1.8.1/java/
? ?下載avro-1.8.1.jar and avro-tools-1.8.1.jar兩個jar包,引入工程;
2)代碼:創建模式-輸入記錄-根據模式獲取記錄
package sk.ann;import java.io.File; import java.io.IOException;import org.apache.avro.Schema; import org.apache.avro.file.DataFileReader; import org.apache.avro.file.DataFileWriter; import org.apache.avro.generic.GenericData; import org.apache.avro.generic.GenericData.Record; import org.apache.avro.generic.GenericDatumReader; import org.apache.avro.generic.GenericDatumWriter; public class AvroDemo {String fileName="D:\\tmp\\student.db";String prefix="{\"type\":\"record\",\"name\":\"student\",\"fields\":[";String suffix="]}";String fieldSID="{\"name\":\"SID\",\"type\":\"int\"}";String fieldName="{\"name\":\"Name\",\"type\":\"string\"}";String fieldDept="{\"name\":\"Dept\",\"type\":\"string\"}";String fieldPhone="{\"name\":\"Phone\",\"type\":\"string\"}";String fieldAge="{\"name\":\"Age\",\"type\":\"int\"}";Schema studentSchema=Schema.parse(prefix+fieldSID+","+fieldName+","+fieldDept+","+fieldPhone+","+fieldAge+suffix);Schema extractSchema=Schema.parse(prefix+fieldName+","+fieldPhone+suffix);int SID=0;public static void main(String[] args) throws IOException{AvroDemo avd=new AvroDemo();avd.init();avd.print();avd.printExtraction();}//初始化學生記錄public void init() throws IOException{DataFileWriter<Record> writer=new DataFileWriter<Record>(new GenericDatumWriter<Record>(studentSchema)).create(studentSchema,new File(fileName));try{writer.append(createStudent("zhanghua","Law","15201161111",25));writer.append(createStudent("Lili","Economy","15201162222",24));writer.append(createStudent("Wangyu","Infomation","15201163333",23));writer.append(createStudent("Zhaoxin","Art","15201164444",25));writer.append(createStudent("Sunqin","Physics","15201165555",23));writer.append(createStudent("Zhouping","Math","15201166666",23));}finally{writer.close();}}//添加學生記錄private Record createStudent(String name,String dept,String phone,int age){Record student=new GenericData.Record(studentSchema);student.put("SID", (++SID));student.put("Name", name);student.put("Dept", dept);student.put("Phone",phone);student.put("Age",age);System.out.println("successfully added"+name);return student;}//輸出學生信息public void print() throws IOException{GenericDatumReader<Record> dr=new GenericDatumReader<Record>();dr.setExpected(studentSchema);DataFileReader<Record> reader=new DataFileReader<Record>(new File(fileName),dr);System.out.println("\n print all the records from database");try{while(reader.hasNext()){Record student=reader.next();System.out.print(student.get("SID").toString()+" "+student.get("Name")+" "+student.get("Dept")+" "+student.get("Phone")+" "+student.get("Age").toString()+"\r\n");}}finally{reader.close();}}//輸出學生姓名和電話public void printExtraction() throws IOException{GenericDatumReader<Record> dr=new GenericDatumReader<Record>();dr.setExpected(extractSchema);DataFileReader<Record> reader=new DataFileReader<Record>(new File(fileName),dr);System.out.println("\n Extract Name&Phone of the records from database");try{while(reader.hasNext()){Record student=reader.next();System.out.print(student.get("Name")+" "+student.get("Phone")+"\r\n");}}finally{reader.close();} }}執行結果:
successfully addedzhanghua successfully addedLili successfully addedWangyu successfully addedZhaoxin successfully addedSunqin successfully addedZhoupingprint all the records from database 1 zhanghua Law 15201161111 25 2 Lili Economy 15201162222 24 3 Wangyu Infomation 15201163333 23 4 Zhaoxin Art 15201164444 25 5 Sunqin Physics 15201165555 23 6 Zhouping Math 15201166666 23Extract Name&Phone of the records from database zhanghua 15201161111 Lili 15201162222 Wangyu 15201163333 Zhaoxin 15201164444 Sunqin 15201165555 Zhouping 15201166666總結
以上是生活随笔為你收集整理的Java实现数据序列化工具Avro的例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos下机器学习算法Mahout库
- 下一篇: MapReduce基础开发之十一Dist