當(dāng)前位置:
首頁(yè) >
Java实现数据序列化工具Avro的例子
發(fā)布時(shí)間:2025/4/16
50
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Java实现数据序列化工具Avro的例子
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、Avro簡(jiǎn)介
Avro是一個(gè)數(shù)據(jù)序列化的系統(tǒng)。
它可以提供:
1)豐富的數(shù)據(jù)結(jié)構(gòu)類型
2)快速可壓縮的二進(jìn)制數(shù)據(jù)形式
3)存儲(chǔ)持久數(shù)據(jù)的文件容器
4)遠(yuǎn)程過(guò)程調(diào)用RPC
5)簡(jiǎn)單的動(dòng)態(tài)語(yǔ)言結(jié)合功能,Avro和動(dòng)態(tài)語(yǔ)言結(jié)合后,讀寫數(shù)據(jù)文件和使用RPC協(xié)議都不需要生成代碼,而代碼生成作為一種可選的優(yōu)化只值得在靜態(tài)類型語(yǔ)言中實(shí)現(xiàn)。
Avro依賴于模式(Schema)。Avro數(shù)據(jù)的讀寫操作是很頻繁的,而這些操作都需要使用模式,這樣就減少寫入每個(gè)數(shù)據(jù)資料的開(kāi)銷,使得序列化快速而又輕巧。這種數(shù)據(jù)及其模式的自我描述方便于動(dòng)態(tài)腳本語(yǔ)言的使用。
當(dāng)Avro數(shù)據(jù)存儲(chǔ)到文件中時(shí),它的模式也隨之存儲(chǔ),這樣任何程序都可以對(duì)文件進(jìn)行處理。如果需要以不同的模式讀取數(shù)據(jù),這也很容易解決,因?yàn)閮蓚€(gè)模式都是已知的。
當(dāng)在RPC中使用Avro時(shí),服務(wù)器和客戶端可以在握手連接時(shí)交換模式。服務(wù)器和客戶端有著彼此全部的模式,因此相同命名字段、缺失字段和多余字段等信息之間通信中需要解決的一致性問(wèn)題就可以容易解決
還有,Avro模式是用JSON(一種輕量級(jí)的數(shù)據(jù)交換模式)定義的,這樣對(duì)于已經(jīng)擁有JSON庫(kù)的語(yǔ)言可以容易實(shí)現(xiàn)。
Avro提供著與諸如Thrift和Protocol Buffers等系統(tǒng)相似的功能,但是在一些基礎(chǔ)方面還是有區(qū)別的,主要是:
1)動(dòng)態(tài)類型:Avro并不需要生成代碼,模式和數(shù)據(jù)存放在一起,而模式使得整個(gè)數(shù)據(jù)的處理過(guò)程并不生成代碼、靜態(tài)數(shù)據(jù)類型等等。這方便了數(shù)據(jù)處理系統(tǒng)和語(yǔ)言的構(gòu)造。
2)未標(biāo)記的數(shù)據(jù):由于讀取數(shù)據(jù)的時(shí)候模式是已知的,那么需要和數(shù)據(jù)一起編碼的類型信息就很少了,這樣序列化的規(guī)模也就小了。
3)不需要用戶指定字段號(hào):即使模式改變,處理數(shù)據(jù)時(shí)新舊模式都是已知的,所以通過(guò)使用字段名稱可以解決差異問(wèn)題。
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兩個(gè)jar包,引入工程;
Avro是一個(gè)數(shù)據(jù)序列化的系統(tǒng)。
它可以提供:
1)豐富的數(shù)據(jù)結(jié)構(gòu)類型
2)快速可壓縮的二進(jìn)制數(shù)據(jù)形式
3)存儲(chǔ)持久數(shù)據(jù)的文件容器
4)遠(yuǎn)程過(guò)程調(diào)用RPC
5)簡(jiǎn)單的動(dòng)態(tài)語(yǔ)言結(jié)合功能,Avro和動(dòng)態(tài)語(yǔ)言結(jié)合后,讀寫數(shù)據(jù)文件和使用RPC協(xié)議都不需要生成代碼,而代碼生成作為一種可選的優(yōu)化只值得在靜態(tài)類型語(yǔ)言中實(shí)現(xiàn)。
Avro依賴于模式(Schema)。Avro數(shù)據(jù)的讀寫操作是很頻繁的,而這些操作都需要使用模式,這樣就減少寫入每個(gè)數(shù)據(jù)資料的開(kāi)銷,使得序列化快速而又輕巧。這種數(shù)據(jù)及其模式的自我描述方便于動(dòng)態(tài)腳本語(yǔ)言的使用。
當(dāng)Avro數(shù)據(jù)存儲(chǔ)到文件中時(shí),它的模式也隨之存儲(chǔ),這樣任何程序都可以對(duì)文件進(jìn)行處理。如果需要以不同的模式讀取數(shù)據(jù),這也很容易解決,因?yàn)閮蓚€(gè)模式都是已知的。
當(dāng)在RPC中使用Avro時(shí),服務(wù)器和客戶端可以在握手連接時(shí)交換模式。服務(wù)器和客戶端有著彼此全部的模式,因此相同命名字段、缺失字段和多余字段等信息之間通信中需要解決的一致性問(wèn)題就可以容易解決
還有,Avro模式是用JSON(一種輕量級(jí)的數(shù)據(jù)交換模式)定義的,這樣對(duì)于已經(jīng)擁有JSON庫(kù)的語(yǔ)言可以容易實(shí)現(xiàn)。
Avro提供著與諸如Thrift和Protocol Buffers等系統(tǒng)相似的功能,但是在一些基礎(chǔ)方面還是有區(qū)別的,主要是:
1)動(dòng)態(tài)類型:Avro并不需要生成代碼,模式和數(shù)據(jù)存放在一起,而模式使得整個(gè)數(shù)據(jù)的處理過(guò)程并不生成代碼、靜態(tài)數(shù)據(jù)類型等等。這方便了數(shù)據(jù)處理系統(tǒng)和語(yǔ)言的構(gòu)造。
2)未標(biāo)記的數(shù)據(jù):由于讀取數(shù)據(jù)的時(shí)候模式是已知的,那么需要和數(shù)據(jù)一起編碼的類型信息就很少了,這樣序列化的規(guī)模也就小了。
3)不需要用戶指定字段號(hào):即使模式改變,處理數(shù)據(jù)時(shí)新舊模式都是已知的,所以通過(guò)使用字段名稱可以解決差異問(wèn)題。
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兩個(gè)jar包,引入工程;
2)代碼:創(chuàng)建模式-輸入記錄-根據(jù)模式獲取記錄
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();}//初始化學(xué)生記錄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();}}//添加學(xué)生記錄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;}//輸出學(xué)生信息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();}}//輸出學(xué)生姓名和電話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();} }}執(zhí)行結(jié)果:
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總結(jié)
以上是生活随笔為你收集整理的Java实现数据序列化工具Avro的例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Centos下机器学习算法Mahout库
- 下一篇: 机器学习知识点(一)文本字符信息熵Jav