avro c++编译与使用

一、arvo介绍

Avro 是 Hadoop 中的一个子项目,也是一个数据序列化系统,其数据最终以二进制格式,采用行式存储的方式进行存储。
Avro提供了:
1)、丰富的数据结构。
2)、可压缩、快速的二进制数据格式。
3)、一个用来存储持久化数据的容器文件。
4)、远程过程调用。
5)、与动态语言的简单集成,代码生成不需要读取或写入数据文件,也不需要使用或实现 RPC 协议。代码生成是一种可选的优化,只值得在静态类型语言中实现。

schema(模式)

Avro 依赖 schema(模式)来实现数据结构的定义,schema 通过 json 对象来进行描述表示,具体表现为:
一个 json 字符串命名一个定义的类型。
一个 json 对象,其格式为
{"type":"typeName" ... attributes ...},其中 typeName 为 原始类型名称 或 复杂类型名称。
一个 json 数组,表示嵌入类型的联合。
schema 中的类型由 原始类型(也就是 基本类型)
(null、boolean、int、long、float、double、bytes 和 string)和 复杂类型(record、enum、array、map、union 和 fixed)组成。

1、原始类型

原始类型包括如下几种:
null:没有值
boolean:布尔类型的值
int:32 3232 位整形
long:64 6464 位整形
float:32 3232 位浮点
double:64 6464 位浮点
bytes:8 88 位无符号类型
string:unicode 字符集序列
原始类型没有指定的属性值,原始类型的名称也就是定义的类型的名称,因此,schema 中的 "string" 等价于 {"type":"string"}。

2、复杂类型

Avro 支持 6 种复杂类型:records、enums、arrays、maps、unions 和 fixed。                      
2.1)records
reocords 使用类型名称 "record",并支持以下属性。
name:提供记录名称的 json 字符串(必选)
namespace:限定名称的 json 字符串
doc:一个 json 字符串,为用户提供该模式的说明(可选)
aliases:字符串的 json 数组,为该记录提供备用名称
fields:一个 json 数组,罗列所有字段(必选),每个字段又都是一个 json 对象,并包含如下属性:
        name:字段的名称(必选)
        doc:字段的描述(可选)
        type:一个 schema,定义如上
        default:字段的默认值
        order:指定字段如何影响记录的排序顺序,有效值为 "ascending"(默认值)、"descending" 和 "ignore"。
         aliases:别名
一个简单实例:

{"type": "record","name": "face","aliases": ["faceattribute"],"fields", [{"name": "score", "type": "float"},{"name": "feature", "type": ["null", "string"]}]
}

2.2)maps

values:map 的值(value)的 schema,其 key 被假定为字符串。
一个实例,声明一个 value 为 long 类型,(key 类型为 string)的 map:

{"type": "map","values": "long","default": {}
}

avro文件格式

Avro 格式是 Hadoop 的一种基于行的存储格式,被广泛用作序列化平台。
Avro 格式以 JSON 格式存储模式,使其易于被任何程序读取和解释。数据本身以二进制格式存储,使其在 Avro 文件中紧凑且高效。
Avro格式是语言中立的数据序列化系统。它可以被多种语言处理(目前是 C、C++、C#、Java、Python 和 Ruby)。

二、avro c++编译

1、avrocpp下载地址

https://avro.apache.org/project/download/里面找到download连接。
https://dlcdn.apache.org/avro/

2、api文档

https://avro.apache.org/docs/

3、编译

需要准备文件:
cmake
avro-cpp-1.11.3.tar.gz
boost_1_66_0
zlib、sanppy 压缩算法库,可选。
通过cmake生成vs解决方案文件。其中的build文件夹是通过cmake创建的,这个是用来编译程序,编译的时候在build里执行。如下图:进入build文件夹,打开Avro-cpp.sln文件,可以编译avrocpp、avrocpp_s、avrogencpp等等工程。如下图:

avro库中还提供了4中文件的压缩方式,sanppy、default、lzma和null
Snappy 是一个 C++ 的用来压缩和解压缩的开发包,其目标不是最大限度压缩,而且不兼容其他压缩格式。Snappy 旨在提供高速压缩速度和合理的压缩率。Snappy 比 zlib 更快,但文件相对要大
20% 到 100%。

snappy zlib lzma 对比
snappy, zlib 和 lzma都是数据压缩算法,但它们各有优势和不同的使用场景。
snappy:
优势:速度快,适合需要快速压缩和解压缩的场景。
缺点:压缩比不如其他算法高,不支持跨平台。
zlib:
优势:压缩比高,支持压缩和解压缩,支持动态数据。
缺点:压缩速度稍慢,解压缩时需要预先加载整个数据。
lzma:
优势:极高的压缩比,支持压缩和解压缩,支持分块处理。
缺点:解压速度慢,初始化时间较长,内存需求较高。
在选择压缩算法时,需要考虑数据大小、压缩比、速度要求以及是否需要跨平台等因素。

三、avro c++使用

1、创建schema

创建一个schema,比如:cpx.json

{
"type": "record", 
"name": "cpx",
"fields" : [
{"name": "re", "type": "double"},    
{"name": "im", "type" : "double"}
]
}

2、使用avrogencpp生成数据结构代码。

avrogencpp -i cpx.json -o cpx.hh

avrogencpp -i cpx.json -o cpx.hh -n myselfnamespace

注意:-n表示使用特殊的命名空间。

3、数据序列化到avro文件实例。

#include "cpx.hh"
#include "avro/Encoder.hh"
#include "avro/Decoder.hh"
#include "avro/ValidSchema.hh"
#include "avro/Compiler.hh"
#include "avro/DataFile.hh"
#include "avro/Specific.hh"
#include <fstream>avro::ValidSchema loadSchema(const char* filename)
{std::ifstream ifs(filename);avro::ValidSchema result;avro::compileJsonSchema(ifs, result);return result;
}int main()
{//将数据序列化到avro文件、从avro文件反序列化数据avro::ValidSchema cpxSchema = loadSchema("cpx.json");//write file{avro::DataFileWriter<c::cpx> dfw("./test.bin", cpxSchema);c::cpx c1;c1.re = 1.0;c1.im = 2.13;dfw.write(c1);for (int i = 0; i < 10; i++) {c1.re = i * 100;c1.im = i + 100;dfw.write(c1);}dfw.close();}//read file{avro::DataFileReader<c::cpx> dfr("./test.bin", cpxSchema);c::cpx c2;while (dfr.read(c2)) {std::cout << '(' << c2.re << ", " << c2.im << ')' << std::endl;}}return 0;
}	

4、数据序列化到内存实例。

#include "cpx.hh"
#include "avro/Encoder.hh"
#include "avro/Decoder.hh"
#include "avro/ValidSchema.hh"
#include "avro/Compiler.hh"
#include "avro/DataFile.hh"
#include "avro/Specific.hh"
#include <fstream>avro::ValidSchema loadSchema(const char* filename)
{std::ifstream ifs(filename);avro::ValidSchema result;avro::compileJsonSchema(ifs, result);return result;
}int main()
{//将数据序列化到内存、从avro内存反序列化数据avro::ValidSchema cpxSchema = loadSchema("cpx.json");//write streamstd::string strOutput = "";{std::stringstream ssOutput;avro::DataFileWriter<c::cpx> dfw(avro::ostreamOutputStream(ssOutput, 8 * 1024),cpxSchema);c::cpx c1;c1.re = 1.0;c1.im = 2.13;dfw.write(c1);for (int i = 0; i < 10; i++){c1.re = i * 100;c1.im = i + 100;dfw.write(c1);}dfw.close();strOutput = ssOutput.str();printf("OutputSize:%d\n", strOutput.size());//临时保存文件std::ofstream ofs("./test2.bin", std::ios::binary);if (ofs.is_open()){ofs.write(strOutput.data(), strOutput.size());ofs.close();}}//read stream{std::stringstream ssOutput;int n = 0;for (n = 0; n < strOutput.size(); n++){ssOutput << strOutput[n];}avro::DataFileReader<c::cpx> dfr(avro::istreamInputStream(ssOutput, 8 * 1024) , cpxSchema);c::cpx c2;while (dfr.read(c2)) {std::cout << '(' << c2.re << ", " << c2.im << ')' << std::endl;}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/599405.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac 每次重启终端都要重新配置mysql环境变量解决办法

1、问题 Mac 每次关闭终端后&#xff0c;mysql环境配置就失效了&#xff0c;需要重新配置mysql环境变量 2、解决方法 在 " ~/.zshrc "文件添加" source ~/.bash_profile "即可 vim ~/.zshrc source ~/.bash_profile 3、验证 退出终端后重新打开终端 mys…

算法 - 符号表-上

&#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 算法 - 符号表前言初级实现1. 链表实现无序符号表2. 二分查找实现有序符号表 二叉查找树1. get()2. put()3. 分析4. floor()5. rank()6. min()7. deleteMin()8. delete()9. keys()10. 分析 算法 - 符号表 前言 符号表&am…

说说虚拟化上部署Oracle RAC的那点注意事项

0.概述 目前在虚拟化上部署RAC主要是以下3个场景 1是VMWARE的虚拟化&#xff08;私有云&#xff09;&#xff1b; 2是国产厂商基于KVM的虚拟化&#xff08;私有云&#xff09;&#xff1b; 3是公有云&#xff0c;由云厂商给你提供虚拟主机和虚拟磁盘。 这里我只对前2个熟悉一些…

C++:MySQL的事务概念与使用(四)

1、事务的概念 定义&#xff1a;事务是构成单一逻辑工作单元的操作集合&#xff0c;要么完整的执行&#xff0c;要么完全不执行。无论发生何种情况&#xff0c;DBS必须保证事务能正确、完整的执行。 性质&#xff1a;事务的四大ACID性质。 原子性(Atomicity)&#xff1a;一个事…

YOLOV8 + 双目测距

YOLOV8 双目测距 1. 环境配置2. 测距流程和原理2.1 测距流程2.2 测距原理 3. 代码部分解析3.1 相机参数stereoconfig.py3.2 测距部分3.3 主代码yolov8-stereo.py 4. 实验结果4.1 测距4.2 测距跟踪4.3 测距跟踪分割4.4 视频展示 相关文章 1. YOLOv5双目测距&#xff08;python&…

qt环境搭建-镜像源安装Qt Creator(5.15.2)以及配置环境变量

前言&#xff1a; 版本&#xff1a;5.15.2 镜像源&#xff1a;ustc与清华 纯小白&#xff0c;找了半天的镜像源安装qtcreator&#xff0c;搞了半天结果安装的是最新的&#xff0c;太新的对小白很不友好&#xff0c;bug比较多&#xff0c;支持的系统也不全&#xff0c;口碑不…

华为海思2024春招数字芯片岗机试题(共9套)

huawei海思2024春招数字芯片岗机试题(共9套&#xff09;&#xff08;WX:didadidadidida313&#xff0c;加我备注&#xff1a;CSDN huawei数字题目&#xff0c;谢绝白嫖哈&#xff09; 题目包含数字集成电路、System Verilog、Verilog2001、半导体制造技术、高级ASIC芯片综合、…

Python | Leetcode Python题解之第15题三数之和

题目&#xff1a; 题解&#xff1a; class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:n len(nums)nums.sort()ans list()# 枚举 afor first in range(n):# 需要和上一次枚举的数不相同if first > 0 and nums[first] nums[first - 1]:continu…

开启Java之旅——用Java实现简易的图书管理系统(24.4.7)

图书管理系统 一、设计思路 1、首先需要区分两类人&#xff0c;图书管理员和借书用户&#xff0c;不同的用户要展现不同的界面&#xff0c;利用继承和多态可以将其实现。 2、要将不同的操作封装起来&#xff0c;单独设计成为一个类&#xff0c;为了规范实现&#xff0c;需要…

解决前端精度丢失问题:后端Long类型到前端的处理策略

在Web开发中&#xff0c;我们经常遇到前后端数据类型不匹配的问题&#xff0c;特别是当后端使用大数据类型如Long时&#xff0c;前端由于JavaScript的数字精度限制&#xff0c;可能导致精度丢失。本文将深入探讨这个问题&#xff0c;并提供两种有效的解决方法。 一、问题背景 …

汇编基础----mov基本操作

汇编基础----mov基本操作 下载VS2022 这个网上教程很多,自行下载安装即可 新建项目 选择空项目,如何点击下一步 在源文件下创建这二个文件 修改配置使asm文件能被解析,右击项目名(demo)->生成依赖项->生成自定义->勾选如下图所示选项->确定 立即数寻址 main…

Linux--APP打开的文件在内核中如何表示

当用户在程序中使用了glibc库提供的文件操作函数open&#xff08;&#xff09;、read&#xff08;&#xff09;等访问文件时&#xff0c;这些函数会调用相应的系统调用来实际执行文件操作&#xff0c;并返回一个整数即文件句柄&#xff0c;文件句柄实际上是对应的 struct file …