首页 > 编程语言 >Apache IoTDB开发系统之C++原生接口

Apache IoTDB开发系统之C++原生接口

时间:2023-09-24 18:09:10浏览次数:56  
标签:std const string IoTDB void C++ vector Apache 模板

安装相关依赖

  • MAC
  1. 安装 Bison :Mac 环境下预安装了 Bison 2.3 版本,但该版本过低不能够用来编译 Thrift。
    使用 Bison 2.3 版本会报以下错误: invalid directive: '%code'
    使用下面 brew 命令更新 bison 版本:
brew install bison
brew link bison --force

添加环境变量:

echo 'export PATH="/usr/local/opt/bison/bin:$PATH"' >> ~/.bash_profile
  1. 安装 Boost :确保安装较新的 Boost 版本。
brew install boost
brew link boost
  1. 检查 OpenSSL :确保 openssl 库已安装,默认的 openssl 头文件路径为”/usr/local/opt/openssl/include”
    如果在编译过程中出现找不到 openssl 的错误,尝试添加-Dopenssl.include.dir=""
  • Ubuntu 20
    使用以下命令安装所有依赖:
sudo apt-get install gcc-9 g++-9 libstdc++-9-dev bison flex libboost-all-dev libssl-dev zlib1g-dev
  • CentOS 7.x
    使用 yum 命令安装部分依赖。
sudo yum install bison flex openssl-devel

使用 yum 安装的 GCC、Boost 版本过低,在编译时会报错,需自行安装或升级。

  • Windows
  1. 构建编译环境
  • 安装 MS Visual Studio(推荐安装 2019 版本):安装时需要勾选 Visual Studio C/C++ IDE and compiler(supporting CMake, Clang, MinGW)。
  • 下载安装 CMakeopen in new window 。
  1. 下载安装 Flex、Bison
  • 下载 Win_Flex_Bisonopen in new window 。
  • 下载后需要将可执行文件重命名为 flex.exe 和 bison.exe 以保证编译时能够被找到,添加可执行文件的目录到 PATH 环境变量中。
  1. 安装 Boost
  1. 安装 OpenSSL

执行编译

从 git 克隆源代码:

git clone https://github.com/apache/iotdb.git

默认的主分支是master分支,如果你想使用某个发布版本,请切换分支 (如 0.13 版本):

git checkout rel/0.13

在 IoTDB 根目录下执行 maven 编译:

  • Mac & Linux
mvn package -P compile-cpp -pl example/client-cpp-example -am -DskipTest
  • Windows
mvn package -P compile-cpp -pl client-cpp,server,example/client-cpp-example -am -Dcmake.generator="your cmake generator" -Dboost.include.dir=${your boost header folder} -Dboost.library.dir=${your boost lib (stage) folder} -DskipTests
  • CMake 根据不同编译平台使用不同的生成器,需添加-Dcmake.generator=""选项来指定使用的生成器名称,例如: -Dcmake.generator="Visual Studio 16 2019"。(通过cmake --help命令可以查看 CMake 支持的生成器列表)
  • 为了帮助 CMake 找到本地安装好的 Boost,在编译命令中需添加相关参数,例如:-DboostIncludeDir="C:\Program Files (x86)\boost_1_78_0" -DboostLibraryDir="C:\Program Files (x86)\boost_1_78_0\stage\lib"

编译成功后,打包好的 zip 文件位于 client-cpp/target/client-cpp-${project.version}-cpp-${os}.zip

基本接口说明

下面将给出 Session 接口的简要介绍和原型定义:

初始化

  • 开启 Session
void open();
  • 开启 Session,并决定是否开启 RPC 压缩
void open(bool enableRPCCompression);

注意: 客户端的 RPC 压缩开启状态需和服务端一致。

  • 关闭 Session
void close();

数据定义接口(DDL)

Database 管理
  • 设置 database
void setStorageGroup(const std::string &storageGroupId);
  • 删除单个或多个 database
void deleteStorageGroup(const std::string &storageGroup);
void deleteStorageGroups(const std::vector<std::string> &storageGroups);
时间序列管理
  • 创建单个或多个非对齐时间序列
void createTimeseries(const std::string &path, TSDataType::TSDataType dataType, TSEncoding::TSEncoding encoding,
                          CompressionType::CompressionType compressor);

void createMultiTimeseries(const std::vector<std::string> &paths,
                           const std::vector<TSDataType::TSDataType> &dataTypes,
                           const std::vector<TSEncoding::TSEncoding> &encodings,
                           const std::vector<CompressionType::CompressionType> &compressors,
                           std::vector<std::map<std::string, std::string>> *propsList,
                           std::vector<std::map<std::string, std::string>> *tagsList,
                           std::vector<std::map<std::string, std::string>> *attributesList,
                           std::vector<std::string> *measurementAliasList);
  • 创建对齐时间序列
void createAlignedTimeseries(const std::string &deviceId,
                             const std::vector<std::string> &measurements,
                             const std::vector<TSDataType::TSDataType> &dataTypes,
                             const std::vector<TSEncoding::TSEncoding> &encodings,
                             const std::vector<CompressionType::CompressionType> &compressors);
  • 删除一个或多个时间序列
void deleteTimeseries(const std::string &path);
void deleteTimeseries(const std::vector<std::string> &paths);
  • 检查时间序列是否存在
bool checkTimeseriesExists(const std::string &path);
元数据模版
  • 创建元数据模板
void createSchemaTemplate(const Template &templ);
  • 挂载元数据模板
void setSchemaTemplate(const std::string &template_name, const std::string &prefix_path);

请注意,如果一个子树中有多个孩子节点需要使用模板,可以在其共同父母节点上使用 setSchemaTemplate 。而只有在已有数据点插入模板对应的物理量时,模板才会被设置为激活状态,进而被 show timeseries 等查询检测到。

  • 卸载元数据模板
void unsetSchemaTemplate(const std::string &prefix_path, const std::string &template_name);

注意:目前不支持从曾经在prefixPath路径及其后代节点使用模板插入数据后(即使数据已被删除)卸载模板。

  • 在创建概念元数据模板以后,还可以通过以下接口增加或删除模板内的物理量。请注意,已经挂载的模板不能删除内部的物理量。
// 为指定模板新增一组对齐的物理量,若其父节点在模板中已经存在,且不要求对齐,则报错
void addAlignedMeasurementsInTemplate(const std::string &template_name,
                                      const std::vector<std::string> &measurements,
                                      const std::vector<TSDataType::TSDataType> &dataTypes,
                                      const std::vector<TSEncoding::TSEncoding> &encodings,
                                      const std::vector<CompressionType::CompressionType> &compressors);

// 为指定模板新增一个对齐物理量, 若其父节点在模板中已经存在,且不要求对齐,则报错
void addAlignedMeasurementsInTemplate(const std::string &template_name,
                                      const std::string &measurement,
                                      TSDataType::TSDataType dataType,
                                      TSEncoding::TSEncoding encoding,
                                      CompressionType::CompressionType compressor);

// 为指定模板新增一个不对齐物理量, 若其父节在模板中已经存在,且要求对齐,则报错
void addUnalignedMeasurementsInTemplate(const std::string &template_name,
                                        const std::vector<std::string> &measurements,
                                        const std::vector<TSDataType::TSDataType> &dataTypes,
                                        const std::vector<TSEncoding::TSEncoding> &encodings,
                                        const std::vector<CompressionType::CompressionType> &compressors);

// 为指定模板新增一组不对齐的物理量, 若其父节在模板中已经存在,且要求对齐,则报错
void addUnalignedMeasurementsInTemplate(const std::string &template_name,
                                        const std::string &measurement,
                                        TSDataType::TSDataType dataType,
                                        TSEncoding::TSEncoding encoding,
                                        CompressionType::CompressionType compressor);

// 从指定模板中删除一个节点及其子树
void deleteNodeInTemplate(const std::string &template_name, const std::string &path);
  • 对于已经创建的元数据模板,还可以通过以下接口查询模板信息:
// 查询返回目前模板中所有物理量的数量
int countMeasurementsInTemplate(const std::string &template_name);

// 检查模板内指定路径是否为物理量
bool isMeasurementInTemplate(const std::string &template_name, const std::string &path);

// 检查在指定模板内是否存在某路径
bool isPathExistInTemplate(const std::string &template_name, const std::string &path);

// 返回指定模板内所有物理量的路径
std::vector<std::string> showMeasurementsInTemplate(const std::string &template_name);

// 返回指定模板内某前缀路径下的所有物理量的路径
std::vector<std::string> showMeasurementsInTemplate(const std::string &template_name, const std::string &pattern);

数据操作接口(DML)

数据写入

推荐使用 insertTablet 帮助提高写入效率。

  • 插入一个 Tablet,Tablet 是一个设备若干行数据块,每一行的列都相同。
  • 写入效率高。
  • 支持写入空值:空值处可以填入任意值,然后通过 BitMap 标记空值。
void insertTablet(Tablet &tablet);
  • 插入多个 Tablet
void insertTablets(std::unordered_map<std::string, Tablet *> &tablets);
  • 插入一个 Record,一个 Record 是一个设备一个时间戳下多个测点的数据
void insertRecord(const std::string &deviceId, int64_t time, const std::vector<std::string> &measurements,
                  const std::vector<TSDataType::TSDataType> &types, const std::vector<char *> &values);
  • 插入多个 Record
void insertRecords(const std::vector<std::string> &deviceIds,
                   const std::vector<int64_t> ×,
                   const std::vector<std::vector<std::string>> &measurementsList,
                   const std::vector<std::vector<TSDataType::TSDataType>> &typesList,
                   const std::vector<std::vector<char *>> &valuesList);
  • 插入同属于一个 device 的多个 Record
void insertRecordsOfOneDevice(const std::string &deviceId,
                              std::vector<int64_t> ×,
                              std::vector<std::vector<std::string>> &measurementsList,
                              std::vector<std::vector<TSDataType::TSDataType>> &typesList,
                              std::vector<std::vector<char *>> &valuesList);
带有类型推断的写入

服务器需要做类型推断,可能会有额外耗时,速度较无需类型推断的写入慢。

void insertRecord(const std::string &deviceId, int64_t time, const std::vector<std::string> &measurements,
                  const std::vector<std::string> &values);


void insertRecords(const std::vector<std::string> &deviceIds,
                   const std::vector<int64_t> ×,
                   const std::vector<std::vector<std::string>> &measurementsList,
                   const std::vector<std::vector<std::string>> &valuesList);


void insertRecordsOfOneDevice(const std::string &deviceId,
                              std::vector<int64_t> ×,
                              std::vector<std::vector<std::string>> &measurementsList,
                              const std::vector<std::vector<std::string>> &valuesList);
对齐时间序列写入

对齐时间序列的写入使用 insertAlignedXXX 接口,其余与上述接口类似:

  • insertAlignedRecord
  • insertAlignedRecords
  • insertAlignedRecordsOfOneDevice
  • insertAlignedTablet
  • insertAlignedTablets
数据删除
  • 删除一个或多个时间序列在某个时间点前或这个时间点的数据
void deleteData(const std::string &path, int64_t time);
void deleteData(const std::vector<std::string> &deviceId, int64_t time);

IoTDB-SQL 接口

  • 执行查询语句
void executeNonQueryStatement(const std::string &sql);
  • 执行非查询语句
void executeNonQueryStatement(const std::string &sql);

示例代码

示例工程源代码:

  • example/client-cpp-example/src/SessionExample.cpp
  • example/client-cpp-example/src/AlignedTimeseriesSessionExample.cpp (使用对齐时间序列)

编译成功后,示例代码工程位于 example/client-cpp-example/target

标签:std,const,string,IoTDB,void,C++,vector,Apache,模板
From: https://blog.51cto.com/u_15123639/7586469

相关文章

  • C++11中std::ref()与&
    C++11中std::ref()与&引言最近看到一个多线程代码如下:typedefunsignedlonglongULL;voidaccumulator_function(conststd::vector<int>&v,ULL&acm,unsignedintbeginIndex,unsignedintendIndex){acm=0;for(unsignedinti=beginIndex;......
  • Linux轻松搭建网站:安装Apache服务攻略
    在如今数字化时代,网站已成为企业宣传和信息传递的重要渠道。而Apache服务器则是众多网站服务中最为常用的一种。本文将详细介绍如何在Linux系统上安装Apache服务,帮助你轻松搭建自己的网站。1.确认Linux版本在开始安装Apache服务之前,需要确认你所使用的Linux版本。常见的Linux发......
  • centos apache 如何在CentOS操作系统上搭建ApacheWeb服务器??
    在今天的互联网时代sogoupinyinlinux,Web服务器已经成为了企业和个人建立网站的重要基础设施之一。而在众多的Web服务器软件中,Apache绝对是最受欢迎和广泛使用的开源Web服务器之一。而在CentOS操作系统上搭建Apache服务器,不仅可以提供高效的性能和稳定性,还可以免费获得高质量的技......
  • C++面试可能会用到的Cache
    LRUCache描述:考虑维护一个按照最近的使用时间来排序的链表,查询操作去哈希表中查当前key所对应的节点的指针,然后把该节点删除后再插入到链表首。插入操作的话先查询当前的key是否存在,如果存在的话先把当前key所对应的节点删除;如果链表已经满了的话就把链表尾部的元素删除,考虑完这......
  • 《C++ Primer Plus》
    第一章预备知识1.1C++简介C++编程语言融合了3种不同的编程方式:C语言代表的过程性语言、面向对象语言、C++模板支持的泛型编程。1.2C++简史C语言  20世纪70年代,贝尔实验室的DennisRitchie致力开发UNIX操作系统。传统上,程序员使用汇编语言来满足这些需求。但由于汇编语......
  • c++总结
    c++prime(常备字典)+c++手册+二十一天学通c++(这个很简单,看个人情况)黑马c++适合绝大多数人入门c++码农论坛更适合二刷,比较精简,讲的不错,但是涉及经验讲解过多,不一定适合新手侯捷以及cherno(这两个是巨佬)适合工作再看......
  • Hadoop是什么? Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并
    Hadoop是什么?Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并行处理任务,支持大规模数据存储和处理。Hadoop的核心组件包括分布式文件系统HDFS和分布式计算框架MapReduce,它们使得Hadoop可以在廉价的硬件上并行地处理大量数据。Hadoop还包括很多相关的项目和子......
  • c++基础
    一、C++输出数据数据是信息的载体,写程序的目的就是为了处理数据。1.数据的分类数据有数字、字符和字符串三种类型。数字:直接书写,如:100、18.52、0、9;字符:用半角的单引号包含的一个符号,如:'A'、'Z'、'0'、'9'、'~'、'+',汉字和全角的标点符号不是字符;字符串:用半角的双引号包含......
  • C++ 的cout格式化输出
    在某些实际场景中,我们经常需要按照一定的格式输出数据,比如输出浮点数时保留2位小数,再比如以十六进制的形式输出整数,等等。对于学过C语言的读者应该知道,当使用printf()函数输出数据时,可以通过设定一些合理的格式控制符,来达到以指定格式输出数据的目的。例如%.2f表示输出浮点......
  • C++ 公司数量 正解
    题目描述在某个城市里住着n个人,现在给定关于n个人的m条信息(即某2个人认识),假设所有认识(直接或间接认识都算认识)的人一定属于同一个公司。若是某两人不在给出的信息里,那么他们不认识,属于两个不同的公司。已知人的编号从1至 n。请计算该城市最多有多少公司。......