Windows下使用C++编译Apache Arrow并读取parquet文件

1.Parquet格式介绍

这是一种分布式的存储方式,最开始接触到,是为了解决大量的行情数据存储问题,如何在python语言下,何种存储结构,既可以节省磁盘空间,同时读写速度又很快

最开始找到的存储格式为hdfs,它既可以压缩存储,而且读取速度也很快,但是在pandas提供的方法下,有一个很难受的bug,当覆盖数据集中某个key的数据,被覆盖的数据的磁盘空间并不会被释放,也就是你不断覆盖某个key的数据,在磁盘中该文件的占用大小会越来越大

后来终于找到,pd.to_parquet的存储方式,它同样支持压缩存储,同时读写速度也是非常优秀。而且它可以只读取指定列的数据,其存储方式简直和pd.DataFrame就是绝配

之后本人绝大部分行情数据都存储成parquet格式,但现在,生产环境是C++,如何能让C++程序也能读取parquet文件呢?

经过一番搜索,终于找到一个csdn的小程序,提供了已经编译好的lib文件和dll文件,在release模式下能正常跑通,但是!在debug模式下读取文件报错了!!应该是需要debug模式下编译生成的dll,那没办法只能自己去编译apache arrow

2.Apache Arrow下载

Apache Arrow源码下载地址: https://dlcdn.apache.org/arrow/

从以上网址,选择对应版本的Apache Arrow进行下载

本人下载是目前最新的稳定版本10.0.0

3.Apache Arrow编译

Apache Arrow编译指导网址:https://arrow.apache.org/docs/developers/cpp/building.html

本人主要根据以上网站的指导,完整的整个编译过程。

Windows下cmake安装

大部分的Linux系统是自带cmake工具的,但是windows系统并没有,需要下载安装,下载地址如下

Download | CMake

本人直接下载cmake的windows压缩包,下载之后直接解压就可以使用

为了方便使用,也可以将cmake下的bin路径添加到系统的环境变量

 

之后在cmd命令行输入cmake,看到如下信息,就是cmake已经配置完成了

 

使用cmake编译Apache Arrow

将Apache Arrow源码下载,解压缩到本地之后,可以看到如下目录,本次的主角当然是cpp文件目录,这是我们需要编译的路径

 

为了把编译的文件单独放在一个文件夹下,需要新建一个build文件夹,这个文件夹在哪里都无所谓,本次就新建在apache-arrow-10.0.0的同级路径下

打开cmd,在cmd中输入

cd /d E:\program\vs\arrow

其中E:\program\vs\arrow是apache-arrow-10.0.0所在路径

然后新建文件夹build,并进入build文件夹

mkdir build
cd build

接下来输入cmake命令进行编译

cmake ..\apache-arrow-10.0.0\cpp 
-A x64 
-DCMAKE_BUILD_TYPE=DEBUG 
-DARROW_PARQUET=ON 
-DARROW_OPTIONAL_INSTALL=ON 
-DARROW_WITH_ZLIB=ON 
-DBOOST_ROOT=E:/program/vs/arrow/boost/boost_1_69_0 
-DBOOST_LIBRARYDIR=E:/program/vs/arrow/boost/lib

其中

…\apache-arrow-10.0.0\cpp 这个路径指向的是之前的那个cpp文件夹,这里也可以使用绝对路径

-A x64 这里是指定使用x64平台

-DCMAKE_BUILD_TYPE=DEBUG 这是指定使用debug模式编译,本次目的主要是编译debug下的dll文件

-DARROW_PARQUET=ON 这个选项是需要编译parquet组件,本次主要是需要编译生成parquet的dll

-DARROW_OPTIONAL_INSTALL=ON 这个选项是只安装目标选项的安装

-DARROW_WITH_ZLIB=ON 这个选项是需要安装zlib功能,python那边输出文件的时候使用的是gzip压缩,故需要安装该功能,不然也无法读取文件

-DBOOST_ROOT=E:/program/vs/arrow/boost/boost_1_69_0 这个选项是执行boost库的路径,由于编译需要使用到boost库

-DBOOST_LIBRARYDIR=E:/program/vs/arrow/boost/lib 这个选项是执行boost库的lib文件路径,在之前已经编译好了boost库,如果没加这选项,该项目貌似也会去编译需要的boost库文件

特别注意:boost的路径必须是/而不能是windows路径的\,不然之后编译会报错!!!

 

执行完成之后会在build文件夹下产生如下文件,使用vs打开arrow.sln,官网建议是使用vs2017及以上版本,本次使用vs2017

 

打开vs之后界面如下,首先需要查看下是否是debug模式,以及平台是否是x64,确认无误之后再ALL BUILD单击右键生成,这时候就开始漫长的生成过程

 

最后生成完成后,发现还有一些项目生成失败,这时候不要急

在输出界面往上翻,找出错误的原因,在这步失败的主要原因基本上是编译过程第三方库需要从github下载,在国内因为限制,很有可能就下载失败了,所以导致第三方库没法编译安装

所以这时候只需要关注要下载什么文件,需要放在哪里这两个问题

 

上图展示了输出界面显示的其中一处错误,分别告诉我们文件从哪里下载,文件要放在哪里,至于输出界面里的“无法打开包括文件”这类错误都是因为没编译第三方库导致的,不用去管

手动下载完对应的文件,并放置到正确的位置之后,再次编译生成

注意:不仅路径要放对,文件名也得对

看到以下结果,就说明编译成功了

 

然后进入build/debug/Debug文件夹下,已经生成了我们需要的arrow.lib、arrow.dll、parquet.lib以及parquet.dll

 

使用apache arrow10.0.0版本的lib以及dll,需要使用std:c++17标准

具体地,在vs下需要去项目属性 -> 配置属性 -> C/C++ ->语言 -> C++语言标准中选择std:c++17

至此就在windows下使用C++调用对应的lib去读取parquet文件了

关注【量化杂货铺】公众号,在后台回复【parquet】,就可以获得使用C++读取parquet的测试程序包,里面含有编译好的lib以及dll

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值