Avro有C, C++, C#, Java, PHP, Python, and Ruby等语言的实现,本文只简单介绍如何在Java中使用Avro进行数据的序列化(data serialization)。本文使用的是Avro 1.7.4,这是写这篇文章时最新版的Avro。读完本文,你将会学到如何使用Avro编译模式、如果用Avro序列化和反序列化数据。

一、准备项目需要的jar包

文本的例子需要用到的Jar包有这四个:avro-1.7.1.jar、avro-tools-1.7.4.jar、 jackson-core-asl-1.8.8.jar、jackson-mapper-asl-1.8.8.jar,请先将这几个jar包下载好,并存放在一个地方(本文是存放在$HIVE_HOME/lib目录中)。如果你是用Maven,你可以在你项目的pom.xml文件中加入以下依赖:

org.apache.avro

avro

1.7.4

org.apache.avro

avro-maven-plugin

1.7.4

generate-sources

schema

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

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

org.apache.maven.plugins

maven-compiler-plugin

1.6

1.6

当然,如果你需要,你也可以在Avro源码中进行编译,获取avro-1.7.1.jar和avro-tools-1.7.4.jar。关于如何编译avro已经超出本文的范围。

二、定义模式(Schema)

在avro中,它是用Json格式来定义模式的。模式可以由基础类型(null, boolean, int, long, float, double, bytes, and string)和复制类型(record, enum, array, map, union, and fixed)的数据组成。本文只是定义了一个简单的模式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"

]

}

]

}

上面的模式是定义了一个用户的记录,在模式定义中,必须包含它的类型("type": "record")、一个名字("name": "User")以及fields。在本例中fields包括了name, favorite_number和favorite_color,上面的模式我们还定义了一个命名空间 ("namespace": "example.avro"),namespace可以名字一起使用,从而组成模式的全名(本例为example.avro.User)。

三、编译模式

Avro可以允许我们根据模式的定义而生成相应的类,一旦我们定义好相关的类,我们程序中就不需要直接使用模式了。可以用avro-tools jar包来生成代码,语法如下: java -jar $HIVE_HOME/lib/avro-tools-1.7.4.jar

compile schema

所以,在本例中我们可以这样来使用 java -jar $HIVE_HOME/lib/avro-tools-1.7.4.jar compile schema user.avsc .

这时候,在当前目录下会生成example/avro/User.java类,细心的读者可能会发现example/avro不就是模式定义中的namespace么?的确是的。

如果你直接用Avro Maven plugin,那么你就不需要手动的编译模式,因为Avro Maven plugin会自动给你编译好。

现在我们已经生成好了一个User.java类,我们就可以用代码生成User,并用avro将它序列化存放到本地文件中,最后我们再将其反序列化。

四、如何使用

我们可以用下面的代码生成几个User: User user1 = new User();

user1.setName("Alyssa");

user1.setFavoriteNumber(256);

// Leave favorite color null

// Alternate constructor

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

// Construct via builder

User user3 = User.newBuilder()

.setName("Charlie")

.setFavoriteColor("blue")

.setFavoriteNumber(null)

.build();

从上面的列子中,我们可以看出,我们可以调用User的构造函数或者是builder来获取一个User实例。下面对上述的几个User进行序列化操作,并将序列化的数据存放到users.avro文件中: // Serialize user1 and user2 to disk

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

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();

运行完这个代码之后,将会在磁盘产生users.avro文件,里面是用avro序列化user的数据。我们可以对其进行反序列化,获取到原来的数据: // Deserialize Users from disk

DatumReader userDatumReader = new SpecificDatumReader(User.class);

DataFileReader dataFileReader =

new DataFileReader(file, userDatumReader);

User user = null;

while (dataFileReader.hasNext()) {

// Reuse user object by passing it to next(). This saves us from

// allocating and garbage collecting many objects for files with

// many items.

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"}

五、一个完整的例子 import java.io.*;

import java.lang.*;

import org.apache.avro.io.DatumWriter;

import org.apache.avro.io.DatumReader;

import org.apache.avro.specific.SpecificDatumWriter;

import org.apache.avro.specific.SpecificDatumReader;

import org.apache.avro.file.DataFileWriter;

import org.apache.avro.file.DataFileReader;

import example.avro.User;

public class Test {

public static void main(String args[]) {

User user1 = new User();

user1.setName("Alyssa");

user1.setFavoriteNumber(256);

// Leave favorite color null

// 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

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

DatumWriter userDatumWriter =

new SpecificDatumWriter(User.class);

DataFileWriter dataFileWriter =

new DataFileWriter(userDatumWriter);

try {

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

dataFileWriter.append(user1);

dataFileWriter.append(user2);

dataFileWriter.append(user3);

dataFileWriter.close();

} catch (IOException e) {

}

//Deserialize Users from dist

DatumReader userDatumReader =

new SpecificDatumReader(User.class);

DataFileReader dataFileReader = null;

try {

dataFileReader = new DataFileReader(file, userDatumReader);

} catch (IOException e) {

}

User user = null;

try {

while (dataFileReader.hasNext()) {

// Reuse user object by passing it to next(). This saves

// us from allocating and garbage collecting many objects for

// files with many items.

user = dataFileReader.next(user);

System.out.println(user);

}

} catch (IOException e) {

}

}

}

编译上述代码: javac -classpath /home/q/hive-0.11.0/lib/avro-1.7.1.jar

:/home/q/hive-0.11.0/lib/avro-tools-1.7.4.jar

:/home/q/hive-0.11.0/lib/jackson-core-asl-1.8.8.jar

:/home/q/hive-0.11.0/lib/jackson-mapper-asl-1.8.8.jar

example/avro/User.java Test.java

运行上述代码: java -classpath /home/q/hive-0.11.0/lib/avro-1.7.1.jar

:/home/q/hive-0.11.0/lib/avro-tools-1.7.4.jar

:/home/q/hive-0.11.0/lib/jackson-core-asl-1.8.8.jar

:/home/q/hive-0.11.0/lib/jackson-mapper-asl-1.8.8.jar:User.jar:.

Test

maven依赖avro_Apache Avro使用入门指南相关推荐

  1. Maven入门指南⑦:Maven的生命周期和插件

    Maven入门指南⑦:Maven的生命周期和插件 一个完整的项目构建过程通常包括清理.编译.测试.打包.集成测试.验证.部署等步骤,Maven从中抽取了一套完善的.易扩展的生命周期.Maven的生命周 ...

  2. Maven入门指南(一)

    原文链接  译文链接  译者:nkcoder  校对:方腾飞 Maven介绍: Maven是一个强大的Java项目构建工具.当然,你也可以使用其它工具来构建项目,但由于Maven是用Java开发的,因 ...

  3. Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)

    Java Gradle入门指南之依赖管理(添加依赖.仓库.版本冲突) 作者:@gzdaijie 本文为作者原创,转载请注明出处:http://www.cnblogs.com/gzdaijie/p/52 ...

  4. kafka maven 依赖_SpringBoot入门建站全系列(二十八)整合Kafka做日志监控

    SpringBoot入门建站全系列(二十八)整合Kafka做日志监控 一.概述 Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端 ...

  5. maven依赖asm_maven 导入asm的依赖 、 简单入门

    asm项目结构 1. 项目结构 1.1. asm的仓库 1.2 核心项目 1.2.1 org.objectweb.asm 和 org.objectweb.asm.signature 1.2.2 org ...

  6. Spark快速入门指南 – Spark安装与基础使用

    本文转载自Spark快速入门指南 – Spark安装与基础使用 Apache Spark 是一个新兴的大数据处理通用引擎,提供了分布式的内存抽象.Spark 正如其名,最大的特点就是快(Lightni ...

  7. 入门指南_Spring Boot2: 快速入门指南

    Spring Boot2: 快速入门指南 简述 对于之前的Spring框架的使用,各种配置文件XML.properties一旦出错之后错误难寻 这也是为什么Spring Boot被推上主流的原因,现在 ...

  8. 搭建Android日志系统 美团点评大前端Logan入门指南

    目录 前言 总览 快速开始 下载官方源码 使用IDEA打开Logan Server项目 使用Docker下载MySQL镜像并启动容器 运行Logan Server 修改db.properties 修改 ...

  9. maven-shade-plugin入门指南

    maven-shade-plugin入门指南 有时候,需要将复杂的项目, 包括各种xml文件属性文件, 类, jar等等打包到一个可以执行的jar包中, 然后用java -jar xxx.jar 来运 ...

最新文章

  1. Python使用matplotlib可视化箱图、seaborn中的boxplot函数可视化分组箱图、在箱图中添加抖动数据点(Dot + Box Plot)
  2. ROBOT STUDIO 学习笔记
  3. (二十九)、Java字符串中去除空格
  4. matlab子函数调用变量,matlab中,怎么样用function自定义函数调用另一个函数名为输入?...
  5. linux7基础——给用户添加sudo权限
  6. 排序算法(5)----堆排序
  7. 手机画面尺寸多少满屏_各种大屏手机之中适合用户的最佳尺寸是多少?
  8. java将图片(jpg/bmp/png)转16位bmp(RBG565)
  9. private、public、protected、internal修饰符的访问权限
  10. ipad文献管理软件_使用ipad看文献,有哪些好用的工具软件?
  11. ssh和ssm的区别,好处
  12. 无法修改计算机时间权限,Win10无法修改时间怎么办?Win10修改系统时间没有权限的解决方法...
  13. 基于CNN的人脸 性别、年龄识别
  14. wamp 增加php 7.2,wamp环境下php7.2升级,WAMP本地环境升级php7+版本
  15. 鸡易发呼吸道疾病的原因 鸡打喷嚏甩鼻用什么药
  16. AMD将用FPGA干什么?
  17. ICMP协议及报文格式
  18. 音乐翻唱软件测试初学者,~~经典歌曲的国语粤语版本对照~~
  19. 世界上最难的视觉图_【若寒专栏】被喻为世界上最难的联赛——2019赛季日本J2联赛球队总结(7 完结)...
  20. 2022最新某人云代挂程序1.3源码+完美版免授权

热门文章

  1. 西安工业大学计算机全国排名,西安工业大学北方信息工程学院排名2018年下滑14名 在独立学院中实力排全国第138名...
  2. java环境变量都是什么意思_Java环境变量,真的还有必要配吗?
  3. mysql 5.6 linux 64_Linux64位服务器编译安装MySQL5.6(CentOS6.4)
  4. modbus-crc16——c语言
  5. web前端工程师学习路线指南,完整Web前端学习路线图
  6. 二维数据和一维指针数组
  7. 外媒:Apple面临着印度iPhone的停用
  8. linux 基本配置tab键和显示行号 和中文输入法
  9. Java核心类库-IO-File类介绍和路径分割符
  10. 模型压缩 | 无需精雕细琢,随机剪枝足矣!(ICLR 2022)