首页
学习
活动
专区
工具
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元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券