Java读写avro例子

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

一、avro是一个数据序列化框架,可以高效得进行序列化和反序列化,支持C, C++, C#,java,php, Python, 和Ruby语言。现在使用Java来读写。

二、环境搭建

1、下载avro-1.7.7.jar and avro-tools-1.7.7.jar两个jar包,放到指定文件目录。下载地址 http://www.trieuvan.com/apache/avro/avro-1.7.7/java/

我放到了D:\soft\avro 文件夹,在改目录下新建java文件夹,用来存放生成的Java代码

2、该目录下新建user.avsc文件,内容是:

{"namespace": "example.avro","type": "record","name": "User","fields": [

{"name": "name", "type": "string"},

{"name": "favorite_number", "type": ["int", "null"]},

{"name": "favorite_color", "type": ["string", "null"]}

]

}

3、打开cmd,进入到该目录,执行命令生成User类,注意命令后面有个".",表示生成的代码放在本目录下。

java -jar avro-tools-1.7.7.jar compile schema user.avsc java .

在该文件夹下的Java文件下的../example/avro/目录下就会生成User.java文件。

4.使用eclipse新建maven项目,在pom.xml加入avro的依赖。

<dependency>

<groupId>org.apache.avro</groupId>

<artifactId>avro</artifactId>

<version>1.7.7</version>

</dependency>

三、生成的User.java文件的内容如下。

把生成的User.java类复制到工程中,注意这个User.java里面生成的User类及其内部类的包名默认是user.avsc文件中的namespace的值,

在本例中也就是example.avro。需要全部替换为自己的包名。

最简单的方法就是把User.java中的example.avro全部替换为自己的包名。

/*** Autogenerated by Avro

*

* DO NOT EDIT DIRECTLY*/packageexample.avro;

@SupPRessWarnings("all")

@org.apache.avro.specific.AvroGeneratedpublicclassUserextendsorg.apache.avro.specific.SpecificRecordBaseimplementsorg.apache.avro.specific.SpecificRecord {publicstaticfinalorg.apache.avro.Schema SCHEMA$ =neworg.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"User\",\"namespace\":\"example.avro\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"favorite_number\",\"type\":[\"int\",\"null\"]},{\"name\":\"favorite_color\",\"type\":[\"string\",\"null\"]}]}");publicstaticorg.apache.avro.Schema getClassSchema() {returnSCHEMA$; }

@Deprecatedpublicjava.lang.CharSequence name;

@Deprecatedpublicjava.lang.Integer favorite_number;

@Deprecatedpublicjava.lang.CharSequence favorite_color;/*** Default constructor. Note that this does not initialize fields

* to their default values from the schema. If that is desired then

* one should use <code>newBuilder()</code>.*/publicUser() {}/*** All-args constructor.*/publicUser(java.lang.CharSequence name, java.lang.Integer favorite_number, java.lang.CharSequence favorite_color) {this.name =name;this.favorite_number =favorite_number;this.favorite_color =favorite_color;

}publicorg.apache.avro.Schema getSchema() {returnSCHEMA$; }//Used by DatumWriter.applications should not call.publicjava.lang.Object get(intfield$) {switch(field$) {case0:returnname;case1:returnfavorite_number;case2:returnfavorite_color;default:throwneworg.apache.avro.AvroRuntimeException("Bad index");

}

}//Used by DatumReader. Applications should not call.@SuppressWarnings(value="unchecked")publicvoidput(intfield$, java.lang.Object value$) {switch(field$) {case0: name = (java.lang.CharSequence)value$;

break;case1: favorite_number = (java.lang.Integer)value$;

break;case2: favorite_color = (java.lang.CharSequence)value$;

break;default:throwneworg.apache.avro.AvroRuntimeException("Bad index");

}

}/*** Gets the value of the 'name' field.*/publicjava.lang.CharSequence getName() {returnname;

}/*** Sets the value of the 'name' field.

*@paramvalue the value to set.*/publicvoidsetName(java.lang.CharSequence value) {this.name =value;

}/*** Gets the value of the 'favorite_number' field.*/publicjava.lang.Integer getFavoriteNumber() {returnfavorite_number;

}/*** Sets the value of the 'favorite_number' field.

*@paramvalue the value to set.*/publicvoidsetFavoriteNumber(java.lang.Integer value) {this.favorite_number =value;

}/*** Gets the value of the 'favorite_color' field.*/publicjava.lang.CharSequence getFavoriteColor() {returnfavorite_color;

}/*** Sets the value of the 'favorite_color' field.

*@paramvalue the value to set.*/publicvoidsetFavoriteColor(java.lang.CharSequence value) {this.favorite_color =value;

}/**Creates a new User RecordBuilder*/publicstaticexample.avro.User.Builder newBuilder() {returnnewexample.avro.User.Builder();

}/**Creates a new User RecordBuilder by copying an existing Builder*/publicstaticexample.avro.User.Builder newBuilder(example.avro.User.Builder other) {returnnewexample.avro.User.Builder(other);

}/**Creates a new User RecordBuilder by copying an existing User instance*/publicstaticexample.avro.User.Builder newBuilder(example.avro.User other) {returnnewexample.avro.User.Builder(other);

}/*** RecordBuilder for User instances.*/publicstaticclassBuilderextendsorg.apache.avro.specific.SpecificRecordBuilderBase<User>implementsorg.apache.avro.data.RecordBuilder<User>{privatejava.lang.CharSequence name;privatejava.lang.Integer favorite_number;privatejava.lang.CharSequence favorite_color;/**Creates a new Builder*/privateBuilder() {super(example.avro.User.SCHEMA$);

}/**Creates a Builder by copying an existing Builder*/privateBuilder(example.avro.User.Builder other) {super(other);if(isValidValue(fields()[0], other.name)) {this.name = data().deepCopy(fields()[0].schema(), other.name);

fieldSetFlags()[0] =true;

}if(isValidValue(fields()[1], other.favorite_number)) {this.favorite_number = data().deepCopy(fields()[1].schema(), other.favorite_number);

fieldSetFlags()[1] =true;

}if(isValidValue(fields()[2], other.favorite_color)) {this.favorite_color = data().deepCopy(fields()[2].schema(), other.favorite_color);

fieldSetFlags()[2] =true;

}

}/**Creates a Builder by copying an existing User instance*/privateBuilder(example.avro.User other) {super(example.avro.User.SCHEMA$);if(isValidValue(fields()[0], other.name)) {this.name = data().deepCopy(fields()[0].schema(), other.name);

fieldSetFlags()[0] =true;

}if(isValidValue(fields()[1], other.favorite_number)) {this.favorite_number = data().deepCopy(fields()[1].schema(), other.favorite_number);

fieldSetFlags()[1] =true;

}if(isValidValue(fields()[2], other.favorite_color)) {this.favorite_color = data().deepCopy(fields()[2].schema(), other.favorite_color);

fieldSetFlags()[2] =true;

}

}/**Gets the value of the 'name' field*/publicjava.lang.CharSequence getName() {returnname;

}/**Sets the value of the 'name' field*/publicexample.avro.User.Builder setName(java.lang.CharSequence value) {

validate(fields()[0], value);this.name =value;

fieldSetFlags()[0] =true;returnthis;

}/**Checks whether the 'name' field has been set*/publicbooleanhasName() {returnfieldSetFlags()[0];

}/**Clears the value of the 'name' field*/publicexample.avro.User.Builder clearName() {

name=null;

fieldSetFlags()[0] =false;returnthis;

}/**Gets the value of the 'favorite_number' field*/publicjava.lang.Integer getFavoriteNumber() {returnfavorite_number;

}/**Sets the value of the 'favorite_number' field*/publicexample.avro.User.Builder setFavoriteNumber(java.lang.Integer value) {

validate(fields()[1], value);this.favorite_number =value;

fieldSetFlags()[1] =true;returnthis;

}/**Checks whether the 'favorite_number' field has been set*/publicbooleanhasFavoriteNumber() {returnfieldSetFlags()[1];

}/**Clears the value of the 'favorite_number' field*/publicexample.avro.User.Builder clearFavoriteNumber() {

favorite_number=null;

fieldSetFlags()[1] =false;returnthis;

}/**Gets the value of the 'favorite_color' field*/publicjava.lang.CharSequence getFavoriteColor() {returnfavorite_color;

}/**Sets the value of the 'favorite_color' field*/publicexample.avro.User.Builder setFavoriteColor(java.lang.CharSequence value) {

validate(fields()[2], value);this.favorite_color =value;

fieldSetFlags()[2] =true;returnthis;

}/**Checks whether the 'favorite_color' field has been set*/publicbooleanhasFavoriteColor() {returnfieldSetFlags()[2];

}/**Clears the value of the 'favorite_color' field*/publicexample.avro.User.Builder clearFavoriteColor() {

favorite_color=null;

fieldSetFlags()[2] =false;returnthis;

}

@OverridepublicUser build() {try{

User record=newUser();

record.name= fieldSetFlags()[0] ?this.name : (java.lang.CharSequence) defaultValue(fields()[0]);

record.favorite_number= fieldSetFlags()[1] ?this.favorite_number : (java.lang.Integer) defaultValue(fields()[1]);

record.favorite_color= fieldSetFlags()[2] ?this.favorite_color : (java.lang.CharSequence) defaultValue(fields()[2]);returnrecord;

}catch(Exception e) {throwneworg.apache.avro.AvroRuntimeException(e);

}

}

}

}

四、用Java实现序列化,即写avro文件。

新建一个Java类

public static void main(String[] args) throws IOException {

// 声明并初始化User对象

// 方式一

User user1 =newUser();

user1.setName("zhangsan");

user1.setFavoriteNumber(21);

user1.setFavoriteColor(null);

// 方式二 使用构造函数//Alternate constructorUser user2 =newUser("Ben", 7, "red");

// 方式三,使用Build方式//Construct via builderUser user3 =User.newBuilder()

.setName("Charlie")

.setFavoriteColor("blue")

.setFavoriteNumber(null)

.build();

String path = "D:\\tmp\\user.avro"; // avro文件存放目录

DatumWriter<User> userDatumWriter =newSpecificDatumWriter<User>(User.class);

DataFileWriter<User> dataFileWriter =newDataFileWriter<User>(userDatumWriter);

dataFileWriter.create(user1.getSchema(),newFile(path));

// 把生成的user对象写入到avro文件

dataFileWriter.append(user1);

dataFileWriter.append(user2);

dataFileWriter.append(user3);

dataFileWriter.close();

}

run一下代码,查看指定文件目录是否生成了avro文件。

五、Java读取avro文件,即实现avro反序列化。

publicstaticvoidmain(String[] args)throwsIOException {

DatumReader<User> reader =newSpecificDatumReader<User>(User.class);

DataFileReader<User> dataFileReader =newDataFileReader<User>(newFile("D:\\tmp\\user.avro"), reader);

User user=null;while(dataFileReader.hasNext()) {

user=dataFileReader.next();

System.out.println(user);

}

}

运行结果:

{"name": "zhangsan", "favorite_number": 21, "favorite_color":null}

{"name": "Ben", "favorite_number": 7, "favorite_color": "red"}

{"name": "Charlie", "favorite_number":null, "favorite_color": "blue"}

至此,例子写完。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航