首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Apache Avro编程快速入门

Maven配置

添加Avro依赖

org.apache.avro

avro

1.11.1

添加Avro插件

org.apache.avro

avro-maven-plugin

1.11.1

generate-sources

schema

${project.basedir}/src/main/avro/

${project.basedir}/src/main/java/

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

使用Avro插件可以自动将Avro Schema转化为Java POJO。

定义Schema

定义Schema文件

注意在 avro 插件的依赖中定义的两个路径:

${project.basedir}/src/main/avro/

${project.basedir}/src/main/java/

该配置的意思是,根据/src/main/avro/下的schema文件,生成对应的类文件到/src/main/java/下,所以我们先创建一个资源文件夹/src/main/avro ,然后再在该资源文件夹下创建 schema 文件,这里定义一个简单的schema文件user.avsc,注意,后缀一定是avsc,其中的内容如下:

namespace: 定义了根据 schema 文件生成的类的包名

生成User类

执行 maven compile 后生成User类。

当然你也可以手动执行,命令如下:

java?-jar?/path/to/avro-tools-1.11.1.jar?compile?schema??

通过生成代码的方式使用Avro

序列化

package?org.example.avro;

import?org.apache.avro.file.DataFileWriter;

import?org.apache.avro.io.DatumWriter;

import?org.apache.avro.specific.SpecificDatumWriter;

import?java.io.File;

import?java.io.IOException;

/**

*?@description:?使用?avro?对?org.example.avro.User?类的对象进行序列化

*?@author?songxt1990

*?@date?2023-12-11?14:32

*?@version?1.0

*/

public?class?AvroSerWithCodeGeneration?{

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

//?Leave?favorite?color?null

User?user1?=?new?User();

user1.setName("Alyssa");

user1.setFavoriteNumber(256);

//?Alternate?constructor

User?user2?=?new?User("Ben",?7,?"red");

//?Construct?via?builder

User?user3?=?User.newBuilder()

.setName("Charlie")

.setFavoriteColor("blue")

.setFavoriteNumber(null)

.build();

//?Serialize?user1,?user2?and?user3?to?disk

DatumWriter?userDatumWriter?=?new?SpecificDatumWriter(User.class);

DataFileWriter?dataFileWriter?=?new?DataFileWriter(userDatumWriter);

dataFileWriter.create(user1.getSchema(),?new?File("users.avro"));

dataFileWriter.append(user1);

dataFileWriter.append(user2);

dataFileWriter.append(user3);

dataFileWriter.close();

}

}

反序列化

import?org.apache.avro.file.DataFileReader;

import?org.apache.avro.io.DatumReader;

import?org.apache.avro.specific.SpecificDatumReader;

import?java.io.File;

import?java.io.IOException;

/**

*?@description:?使用?avro?对?org.example.avro.User?类的对象进行反序列化

*?@author?Songxt1990

*?@date?2023-12-11?14:40

*?@version?1.0

*/

public?class?AvroDesWithCodeGeneration?{

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

//?Deserialize?Users?from?disk

DatumReader?userDatumReader?=?new?SpecificDatumReader(User.class);

DataFileReader?dataFileReader?=?new?DataFileReader(new?File("users.avro"),?userDatumReader);

User?user?=?null;

while?(dataFileReader.hasNext())?{

user?=?dataFileReader.next(user);

System.out.println(user);

}

}

}

运行结果如下:

{"name":?"Alyssa",?"favorite_number":?256,?"favorite_color":?null}

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

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

通过不生成代码的方式使用Avro

序列化

/**

*?@description:?通过不生成代码的方式使用avro序列化User对象

*?@author?Songxt1990

*?@date?2023-12-11?14:55

*?@version?1.0

*/

public?class?AvroWithoutCodeGeneration?{

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

Schema?schema?=?new?Schema.Parser().parse(new?File("src/main/avro/user.avsc"));

//?Leave?favorite?color?null

GenericRecord?user1?=?new?GenericData.Record(schema);

user1.put("name",?"Alyssa");

user1.put("favorite_number",?256);

GenericRecord?user2?=?new?GenericData.Record(schema);

user2.put("name",?"Ben");

user2.put("favorite_number",?7);

user2.put("favorite_color",?"red");

//?Serialize?user1?and?user2?to?disk

File?file?=?new?File("users.avro");

DatumWriter?datumWriter?=?new?GenericDatumWriter(schema);

DataFileWriter?dataFileWriter?=?new?DataFileWriter(datumWriter);

dataFileWriter.create(schema,?file);

dataFileWriter.append(user1);

dataFileWriter.append(user2);

dataFileWriter.close();

}

}

反序列化

/**

*?@description:?通过不生成代码的方式使用avro反序列化User对象

*?@author?Songxt1990

*?@date?2023-12-11?14:55

*?@version?1.0

*/

public?class?AvroDesWithoutCodeGeneration?{

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

Schema?schema?=?new?Schema.Parser().parse(new?File("src/main/avro/user.avsc"));

//?Deserialize?users?from?disk

DatumReader?datumReader?=?new?GenericDatumReader(schema);

DataFileReader?dataFileReader?=?new?DataFileReader(new?File("users.avro"),?datumReader);

GenericRecord?user?=?null;

while?(dataFileReader.hasNext())?{

user?=?dataFileReader.next(user);

System.out.println(user);

}

}

}

运行结果如下:

{"name":?"Alyssa",?"favorite_number":?256,?"favorite_color":?null}

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

参考链接

Getting Started (Java) | Apache Avro

  • 发表于:
  • 原文链接https://page.om.qq.com/page/ObZnX0iN4ePa5akgo58ve2hQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com