使用Apache Avro序列化、反序列化数据

详细介绍apache Avro协议 Apache Avro是一种数据序列化框架,最初由Apache Hadoop项目开发。它使用JSON格式来定义数据结构(模式),并提供了一种紧凑的二进制格式来存储和传输数据。Avro具有高效的序列化和反序列化性能,是Hadoop生态系统中的标准数据交换格式。首先,需要定义一个Avro模式文件(schema)来描述数据结构。 阅读详情

本文通过两个示例介绍如何使用avro序列化,反序列数据(Avro的简介请参阅:https://blog.youkuaiyun.com/Mathieu66/article/details/105601509)。

我们知道使用Avro序列化、反序列化数据时需要使用数据的schema(schema是对数据结构的描述)。使用时,可以生成schema描述的java类,再基于生成的java类做数据处理,也可以不生成,使用Avro提供的通用数据结构GenericRecord。生成java类的方法官网提供了两种:

1)使用avro提供的工具包手动生成(这与使用Protocol Buffer类似),这种方式略显麻烦,这里不做介绍。

java -jar /path/to/avro-tools-1.9.2.jar compile schema <schema file> <destination>

2)使用maven插件,编译后自动生成。

这里我们先介绍不生成schema Java类的Avro列化反序列化使用方式,之后再介绍需要生成schema Java类的方式。

我们的demo很简单,使用json描述User的基本信息,实例化User,序列化,写出到文件,然后再反序列化将其读出打印在控制台。

首先,我们要定义schema信息User.avsc,位置可自定义(我的在test-avro/src/main/avro目录下,test-avro是项目名)。

namespace是生成schema Java类时使用的。比如这里的User.java将会生成在mvn插件定义的outputDirectory下的com.mathieu.avro路径下。

{"namespace": "com.mathieu.avro",
 "type": "record",
 "name": "User",
 "fields": [
     {"name": "name", "type": "string"},
     {"name": "favorite_number",  "type": ["int", "null"]},
     {"name": "favorite_color", "type": ["string", "null"]}
 ]
}

两种方式均需要引入Avro依赖包

<dependency>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro</artifactId>
  <version>1.9.2</version>
</dependency>

下面开始实操:

1. 不生成schema Java类的方式

package com.mathieu.avro;

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.GenericDatumReader;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;

import java.io.File;
import java.io.IOException;

/**
 * 不生成Schema代码的Avro示例.
 */
public class AvroDemoWithoutCodeGeneration {
  public static void main(String[] args) throws IOException {
    // 读取Schema
    Schema schema = new Schema.Parser().parse(new File("test-avro/src/main/avro/User.avsc"));

    // 使用schema创建用户对象.
    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");

    // 序列化并写出到磁盘
    File file = new File("test-avro/src/main/resources/users.avro");
    DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);
    DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter);
    dataFileWriter.create(schema, file);
    dataFileWriter.append(user1);
    dataFileWriter.append(user2);
    dataFileWriter.close();

    // 从磁盘反序列化,打印在控制台
    DatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord>(schema);
    DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(file, 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"}
  }
}

2.生成Schema Java类的方式

需要添加maven插件

      <plugin>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro-maven-plugin</artifactId>
        <version>1.9.2</version>
        <executions>
          <execution>
            <phase>generate-sources</phase>
            <goals>
              <goal>schema</goal>
            </goals>
            <configuration>
              <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
              <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>

注意:

${project.basedir}/src/main/avro  -> User.avsc文件所在路径

${project.basedir}/src/main/java + namespace -> User.java文件坐在路径

在执行 mvn compile 生成User.java文件(第一种方式不会生成User.java文件)。

使用User.java进行数据序列化反序列化的代码:

package com.mathieu.avro;

import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;

import java.io.File;
import java.io.IOException;

/**
 * Avro示例(使用CodeGeneration).
 *
 */
public class AvroDemoWithCodeGeneration {
  public static void main(String[] args) throws IOException {
    // 使用三种不同的方式实例化三个user
    User user1 = new User();
    user1.setName("Alyssa");
    user1.setFavoriteNumber(256);

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

    User user3 = User.newBuilder()
        .setName("Charlie")
        .setFavoriteColor("blue")
        .setFavoriteNumber(null)
        .build();

    // 序列化user1, user2 and user3 到磁盘
    DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
    DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
    File file = new File("test-avro/src/main/resources/users.avro");
    dataFileWriter.create(user1.getSchema(), file);
    dataFileWriter.append(user1);
    dataFileWriter.append(user2);
    dataFileWriter.append(user3);
    dataFileWriter.close();

    // 从磁盘反序列化
    DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
    DataFileReader<User> dataFileReader = new DataFileReader<User>(file, 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"}*/

  }
}

参考:http://avro.apache.org/docs/current/gettingstartedjava.html

Apache Iecberg 从入门到放弃(2) —— Iceberg文件解析 背景介绍 上一章我们讲过了如何将Flink和Iceberg结合,演示了一些常用的操作,并且在文章的最后演示了一个比较全的DEMO。 主要是讲了一些使用上的内容,对于原理没有太过深入,而既然我们的标题是从入门到放弃,那么必然是要对Iceberg进行深入了解的,不然怎么会放弃呢???? 所以,今天我们就来对Flink 结合 Iceberg后,写在HDFS上的元数据文件进行解析 不过在开始之前先准备一下工作 先下载avro-tools点我下载用来分析我们的元数据文件 再将我们上一次表中的所有元数据文件下载下来 h 阅读详情

相关推荐

Apache Avro简介与操作

本文根据Apache Avro官方文档所写,http://avro.apache.org/docs/current/index.html.一、Avro简介avro是一个数据序列化系统 提供了: 丰富的数据结构 紧凑的,快速的,二进制的数据格式 一种文件格式,用于存储持久化数据 远程过程调用系统(RPC) 和动态语言的简单交互。并不需要为数据文件读写产生代码,也不需要使用或实现RPC协议。代码生成是

小小本科生成长之路 4443

Apache Avro 入门

1. 简介 Apache Avro(以下简称 Avro)是一种与编程语言无关的序列化格式。Doug Cutting 创建了这个项目,目的是提供一种共享数据文件的方式。 Avro 数据通过与语言无关的 schema 来定义。schema 通过 JSON 来描述,数据被序列化成二进制文件或 JSON 文件,不过一般会使用二进制文件。Avro 在读写文件时需要用到 schema,schema 一般会...

Horace Ho的博客 974

Apache Avro 1.8.1 入门指南(Java)

Apache Avro是一个数据序列化系统。序列化就是将对象转换成二进制流,相应的反序列化就是将二进制流再转换成对应的对象。因此,Avro就是用来在传输数据之前,将对象转换成二进制流,然后此二进制流达到目标地址后,Avro再将二进制流转换成对象。

strongyoung的专栏 8754

使用Apache Avro

Avro[1]是最近加入到Apache的Hadoop家族的项目之一。为支持数据密集型应用,它定义了一种数据格式并在多种编程语言中支持这种格式。 Avro提供的功能类似于其他编组系统,如Thrift、Protocol Buffers等。而Avro的主要不同之处在于[2]: “动态类型:Avro无需生成代码。数据总是伴以模式定义,这样就可以在不生成代码、静态数据类型的情况下对数据进行...

幸运小侯子 398

OS实验xv6 6.S081 开坑

OS实验xv6 6.S081 开坑 终于把xv6 2019 6.S081做完了,网络部分没有写,因为有计网实验了。怎么说呢,xv6的坑有点多,能做完多亏了:和我同学ljj交流,参考RedemptionC老哥的博客(他写的非常详细,遗憾的是,他好像没有写mmap),再者就是参考这位老哥的做法(没有源码,写得不是特别详细,不过有借鉴作用,mmap就是借鉴了他的思想)……废话不多说了,直接开始。 实验指导 首推RedemptionC的博客 这位老哥的个人博客 xv6 6.S081官网(后面的实验都要参考官网

不定期更新系统使用、编程小技巧,哔哩哔哩账号:https://space.bilibili.com/399455629,欢迎关注 4493

机器人强化学习入门学习笔记

如果你追求高精度动力学仿真、用于强化学习或机器人研究,MuJoCo 是一个非常优秀的选择。如果需要快速实验、使用真实机器人模型,PyBullet 或 Gazebo可能更合适;如果你追求大规模并行训练,Isaac Gym 或 BraX会更高效。legged gym底层是​编辑isaacgym,基于gpu训练可以多环境并行训练,收敛到一个稳定行走的策略快。本视频MuJoCo基于cpu训练很慢。

xiaomu_347的博客 1462

kafka使用Apache Avro框架反序列化数据

kafka使用Apache Avro框架反序列化数据Apache Avro功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导...

终生学习践行者 3213

Docker部署 SRS rtmp/flv流媒体服务器

SRS(Simple Realtime Server)是一款开源的流媒体服务器,具有高性能、高可靠性、高灵活性的特点,能够支持直播、点播、转码等多种流媒体应用场景。SRS 不仅提供了流媒体服务器,还提供了适用于多种平台的客户端 SDK 和在线转码等辅助服务,是一款十分强大的流媒体解决方案。

m0_56659620的博客 4869

java 读取avro 文件_Apache Avro序列化/反序列化数据及Spark读取avro数据

导语本篇文章主要讲如何使用Apache Avro序列化数据以及如何通过spark将序列化数据转换成DataSet和DataFrame进行操作。Apache Arvo是什么?Apache Avro 是一个数据序列化系统。支持丰富的数据结构快速可压缩的二进制数据格式存储持久数据的文件容器远程过程调用(RPC)动态语言的简单集成Avro提供Java、Python、C、C++、C#等语言API接口,下面我...

weixin_39854440的博客 760

智算中心建设全流程指南:从规划到落地

智算中心的建设是一个复杂而系统的过程,涉及选址、立项、办理相关手续、设计、土建、机电安装、调试、验收等多个环节。每个环节都需要充分考虑各种因素,并注意相关的事项,以确保智算中心的顺利建设和高效运行

数据中心全生命周期价值管理 3396

[Unity实战]热更新如何预防过度裁剪

假设你现在有一个游戏客户端,客户端只打包了入口场景,游戏场景都存放在了AB包。

u012587406的博客 1605

Apache avro常用Java中数据类型序列与反序列化

背景 在大数据领域,总是会遇到需要将各种数据类型序列化成字节数组,或者从字节数组反序列化回常用数据类型的场景,比如,Spark中推荐使用kyro,HBase中,使用HBase提供的工具来进行序列化以及反序列化,HBase内部使用google的probuff来序列化进行网络通讯等情况,以及hadoop使用Apache avro来序列化。当然,各种序列化方式的性能以及效率各种优缺点(此文不做对比)。 以上序列化都是框架内部已经给我们做好了序列化以及反序列化操作,如果我们在实际工作中,需要自己手动来序列化的场景,

TMH_ITBOY的博客 1536

Appstore 3.2(f)违规自救指南:从触发到申诉的完整应对策略

本文详细解析了Appstore 3.2(f)违规的应对策略,从触发原因到申诉流程,帮助开发者有效自救。文章涵盖隐瞒行为、账户关联和信息造假三大违规场景的判定逻辑,并提供申诉信写作的黄金法则和长期合规防御措施,确保开发者能够顺利通过苹果审核。

weixin_29304985的博客 661

一文解析Apache Avro数据

摘要:本文将演示如果序列化生成avro数据,并使用FlinkSQL进行解析。

华为云官方博客 2285

Python爬虫实战:爬取小红书数据做爆款分析,我破解了签名加密+移动端反爬(附完整代码)

爬取小红书数据的核心,不是“简单的HTTP请求”,而是“理解移动端接口的加密逻辑和反爬规则”——从x-s/x-t签名破解到移动端UA伪装,再到行为模拟,每一步都是对移动端爬虫的深度理解。这套方案的价值在于,不仅能稳定抓取小红书数据,还能从数据中拆解出有价值的爆款特征,真正把“数据”变成“洞察”。对程序员来说,小红书爬虫不仅是技术练手,更是了解新媒体平台数据逻辑的窗口。希望这篇分享能帮到做新媒体分析或爬虫进阶的小伙伴,也欢迎在评论区交流小红书反爬和爆款分析的更多技巧!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2058

SAP 生产订单归档简介

通常在使用了几年的SAP后,系统中会产生非常多的数据在系统中,特别是制造业的生产订单,常年的累积会存在很多的订单在系统中,这个时候就可以使用归档的功能,对生产订单进行处理。标记DLFL的前提是需要完成生产订单的差异结算,DLFL标记可以清除掉生产订单的相关需求和预留。6、在执行CO78选择删除,前面的操作相当于我们把需要归档的数据写入了数据库中,现在正式进行数据的归档删除。然后我们co03在去看生产订单,可以看到生产订单中多了删除的状态和标记的状态。我这里直接执行的程序PPARCHP1,效果其实是一样的。

我小时候很黑的博客 2285

Kafka使用Avro序列化和反序列化

Apache Avro是一种与编程语言无关的序列化格式。提供了一种共享数据文件的方式。Avro 数据通过与语言无关的 schema 来定义。schema 通过 JSON 来描述,数据被序列化成二进制文件或 JSON 文件,不过一般会使用二进制文件。Avro 在读写文件时需要用到 schema,schema 一般会被内嵌在数据文件里。

warybee 8626

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Apache Avro 1.11.0 入门 (Java 版本)

这是使用 Java 开始使用 Apache Avro™ 的简短指南。 本指南仅涵盖使用 Avro 进行数据序列化; 请参阅 Patrick Hunt 的 Avro RPC 快速入门,了解如何使用 Avro 进行 RPC。 1. 下载 可以从 Apache Avro™ 发布页面下载 C、C++、C#、Java、PHP、Python 和 Ruby 的 Avro 实现。 本指南使用撰写本文时的最新版本 Avro 1.11.0。 对于本指南中的示例,请下载 avro-1.11.0.jar 和 avro-tools-

拉风小宇的博客 2349

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

avro序列化与反序列化

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34378969的博客 461

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Apache Avro使用入门指南

原文链接:https://www.iteblog.com/archives/1008.html#comments Avro有C, C++, C#, Java, PHP, Python, and Ruby等语言的实现,本文只简单介绍如何在Java中使用Avro进行数据的序列化(data serialization)。本文使用的是Avro 1.7.4,这是写这篇文章时最新版的Avro。读完本文,

wzylangjitianya的博客 1406

avro序列化和反序列化——利用avsc文件方式

主要参考:https://blog.youkuaiyun.com/u013054888/article/details/64444908上一篇中(https://blog.youkuaiyun.com/wild46cat/article/details/80963111),我们在构建序列化和反序列化的时候,我们必须有avro编译出来的类文件,其实我们只要avsc的schema文件就可以进行序列化和反序列化。序列化:pac...

archer的技术故事 6329

Java AVRO序列化入门

Apache Avro是一个数据序列化系统。序列化就是将对象转换成二进制流, 相应的反序列化就是将二进制流再转换成对应的对象。 因此,Avro就是用来在传输数据之前,将对象转换成二进制流,然后此二进制流达到目标地址后,Avro再将二进制流转换成对象。 Avro提供: 丰富的数据结构 一个紧凑的,快速的,二进制的数据格式 一个容器文件,来存储持久化数据 远程过程调用(RPC) 简单的动态语言集成。 代码生成不需要读写数据文件,也不要使用或实现RPC协议。代码生成是作为一个可选的优化,只对静态类型的语言值得实

qq_42219004的博客 2745

什么是Apache Avro?

是一个开源的数据序列化框架,主要用于高效的数据交换和存储。它由 Apache Hadoop 项目开发,广泛应用于大数据生态系统中(如 Hadoop、Kafka 等)。Avro 提供了一种紧凑、快速的二进制数据格式,同时支持丰富的数据结构和模式演化。Apache Avro 是一种功能强大的数据序列化工具,适用于大数据场景下的高效数据存储和传输。其紧凑的二进制格式、模式驱动的设计以及灵活的模式演化能力,使其成为现代分布式系统中的重要组件。

╮(╯_╰)╭ Don't expect me to reply to you in time 1572

Avro序列化与反序列化

Avro序列化与反序列化 简介 Avro是一个数据序列化工具,用语言无关的模式定义,Avro支持二进制编码和JSON编码两种序列化方式。 使用maven插件 包结构 pom <dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> <version>1.8.2</version> </

localhost65535的博客 837

Avro kafka(Producer-Consumer)

xyz.avsc{ "namespace": "xyz.test", "type": "record", "name": "payload", "fields":[ { "name": "name", "type": "string" }, { "name": "id", "type": ["int", "null"] },

mllhxn的专栏 2533

Spark-Avro学习8之Java Avro使用(不生成code方式)

1.解释    Avro与thrift,protocol buffer区别之一是:Dynamic typing: 不必需生成代码(生成代码只是优化选项) 2.代码: /** * @author xubo * time 20160502 * ref http://avro.apache.org/docs/1.7.7/gettingstartedjava.html#Defi

Keep Learning 1862
上一篇: Apache Avro简介
下一篇: Flink集成Apollo获取配置V2
Mathieu66
博客等级 码龄10年 68粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值