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包,引入工程;
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的例子相关推荐
- 一个java随机数据的工具类
获得随机数据工具类 在一些业务还有测试中可能需要一些有实际意义的测试数据,编写这些数据可能比较头大,这里写了一个随机数据的工具类,具有以下功能: 获得指定长度的随机大写.小写.数字字母 获得随机的性别 ...
- Google FlatBuffers——开源、跨平台的新一代序列化工具
>>> Google FlatBuffers--开源.跨平台的新一代序列化工具 转载自:http://www.cnblogs.com/lizhenghn/p/3854244.html ...
- .NET序列化工具Jil、Json.NET和Protobuf的简单测评
前一段时间逛园子的时候发现有人比较了Jil.Json.NET和Protobuf的性能,一时好奇,也做了个测试,这里记录下来,以供查阅. 前期准备 依赖类库的话,可以通过Nuget在公共组件库总下载,这 ...
- java 序列化工具kryo_java jackson avro kryo等几种序列化与反序列化工具的使用
最近由于工作需要,需要研究常用的集中序列化方式,主要目的是对象序列化后占用空间会大大减少,便于存储和传输,下面是几种序列化方式的使用demo 1. Java自带的Serialize 依赖jar包:无 ...
- 【序列化】Java中将使用PHP序列化工具将数据序列化
在项目中需要和PHP公用一个MySQL数据库,有些数据需要序列化之后保存,这就需要将待存储的数据序列化之后存到数据库中,取出的时候,需要反序列化之后才能正常使用. 原数据: {"060088 ...
- avro数据序列化/反序列化
序列化:把数据加工成特定的格式 反序列化:把特定格式的数据解析成对象 Avro提供了两种序列化和反序列化的方式:一种是通过Schema文件来生成代码的方式,一种是不生成代码的通用方式,这两种方式都需要 ...
- Java序列化工具的对比
在Java开发工具当中,Java序列化工具是比较常用的,而且种类也有不少,下面小编就来做个对比: 1.Java序列化工具的技术原理对比 Binary Formats & language-sp ...
- 高效数据序列化的工具 FlatBuffers 的初体验
2019独角兽企业重金招聘Python工程师标准>>> 1. 背景 最近在项目中需要使用一种高效数据序列化的工具.碰巧在几篇文章中都提到了FlatBuffers 这个库.特别是 An ...
- hadoop的Avro数据序列化系统
1.什么是Avro Avro设计用于支持大批量数据交换的应用 Avro可以将数据结构或者对象转换成便于存储或者传输的格式. 为了hadoop的前途考虑,DougCutting主导开发的一套新的序列化系 ...
最新文章
- U-LanD:基于不确定性的视频地标检测
- JAVA字符串格式化-String.format()的使用
- 【剑指offer-Java版】35第一个只出现一次的字符
- SonarQube代码质量管理工具安装与使用(sonarqube5.1.2 + sonar-runner-dist-2.4 + MySQL5.x)
- 简明Linux命令行笔记:sort
- 《Java 7程序设计入门经典》一3.14 像使用goto语句一样使用break语句
- 【技术解决方案】GitHub本地仓库管理与远程仓库管理
- mysql 用户管理表_mysql用户管理
- 死循环线程php,QObject的派生类方法实现多线程死循环问题
- 第4.17章读书笔记
- 高速EDA设计课程报告(三)
- qt在linux下编译资源文件,linux下Qt qrc文件的编写与应用
- Arduino使用433MHz RF射频发射器和接收器的方法
- linux下借助有道在线词典查词
- 移位运算符的介绍与使用
- [Android]实现高德地图导航
- pixi 平铺精灵 demo (一)
- MySQL学习笔记(2)
- windows ios良心软件推荐
- 1 个月将公众号阅读量提高了 2 倍,怎么做到的?
热门文章
- Hadoop详解(十一):Yarn设计理念与基本架构
- 现代操作系统: 第五章 输入/输出
- 设置 mock_【学习】接口测试-使用mock生产随机数据
- Windows Server 2008服务器管理新技巧6则第4/4页
- SCU - 4438 Censor
- Activiti工作流的应用示例
- MvvmLight:Command
- [转]C# WinForm 关于窗体最大化时的是否全屏效果与是否遮盖任务栏
- linux qcom LCD framwork
- python入门到精通自学_python入门到精通大型视频、自学者的福利