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

Apache IoTDB开发系统之Python原生接口

时间:2023-09-22 20:32:02浏览次数:43  
标签:session Session Python np lst IoTDB Apache TSDataType thrift

依赖

在使用 Python 原生接口包前,您需要安装 thrift (>=0.13) 依赖。

使用示例

首先下载最新安装包:pip3 install apache-iotdb

注意:如果您想要安装 0.13.0 版本的 Python API,不要使用 pip install apache-iotdb==0.13.0,请使用 pip install apache-iotdb==0.13.0.post1 作为替代!

您可以从这里得到一个使用该包进行数据读写的例子:Session Example (opens new window)

关于对齐时间序列读写的例子:Aligned Timeseries Session Example (opens new window)

(您需要在文件的头部添加import iotdb

或者:

from iotdb.Session import Session

ip = "127.0.0.1"
port_ = "6667"
username_ = "root"
password_ = "root"
session = Session(ip, port_, username_, password_)
session.open(False)
zone = session.get_time_zone()
session.close()

基本接口说明

下面将给出 Session 对应的接口的简要介绍和对应参数:

初始化

  • 初始化 Session
session = Session(ip, port_, username_, password_, fetch_size=1024, zone_id="UTC+8")
  • 开启 Session,并决定是否开启 RPC 压缩
session.open(enable_rpc_compression=False)

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

  • 关闭 Session
session.close()

数据定义接口 DDL

存储组管理

  • 设置存储组
session.set_storage_group(group_name)
  • 删除单个或多个存储组
session.delete_storage_group(group_name)
session.delete_storage_groups(group_name_lst)

时间序列管理

  • 创建单个或多个时间序列
session.create_time_series(ts_path, data_type, encoding, compressor,
    props=None, tags=None, attributes=None, alias=None)

session.create_multi_time_series(
    ts_path_lst, data_type_lst, encoding_lst, compressor_lst,
    props_lst=None, tags_lst=None, attributes_lst=None, alias_lst=None
)
  • 创建对齐时间序列
session.create_aligned_time_series(
    device_id, measurements_lst, data_type_lst, encoding_lst, compressor_lst
)

注意:目前暂不支持使用传感器别名。

  • 删除一个或多个时间序列
session.delete_time_series(paths_list)
  • 检测时间序列是否存在
session.check_time_series_exists(path)

数据操作接口 DML

数据写入

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

  • 插入一个 Tablet,Tablet 是一个设备若干行数据块,每一行的列都相同
  • 写入效率高
  • 支持写入空值 (0.13 版本起)

Python API 里目前有两种 Tablet 实现

  • 普通 Tablet
values_ = [
    [False, 10, 11, 1.1, 10011.1, "test01"],
    [True, 100, 11111, 1.25, 101.0, "test02"],
    [False, 100, 1, 188.1, 688.25, "test03"],
    [True, 0, 0, 0, 6.25, "test04"],
]
timestamps_ = [1, 2, 3, 4]
tablet_ = Tablet(
    device_id, measurements_, data_types_, values_, timestamps_
)
session.insert_tablet(tablet_)
  • Numpy Tablet

相较于普通 Tablet,Numpy Tablet 使用 numpy.ndarray (opens new window) 来记录数值型数据。 内存占用和序列化耗时会降低很多,写入效率也会有很大提升。

注意

  1. Tablet 中的每一列时间戳和值记录为一个 ndarray
  2. ndarray 推荐使用如下面例子中的特定的 dtype,如果不使用,不会影响正确性。
data_types_ = [
    TSDataType.BOOLEAN,
    TSDataType.INT32,
    TSDataType.INT64,
    TSDataType.FLOAT,
    TSDataType.DOUBLE,
    TSDataType.TEXT,
]
np_values_ = [
    np.array([False, True, False, True], TSDataType.BOOLEAN.np_dtype()),
    np.array([10, 100, 100, 0], TSDataType.INT32.np_dtype()),
    np.array([11, 11111, 1, 0], TSDataType.INT64.np_dtype()),
    np.array([1.1, 1.25, 188.1, 0], TSDataType.FLOAT.np_dtype()),
    np.array([10011.1, 101.0, 688.25, 6.25], TSDataType.DOUBLE.np_dtype()),
    np.array(["test01", "test02", "test03", "test04"], TSDataType.TEXT.np_dtype()),
]
np_timestamps_ = np.array([1, 2, 3, 4], TSDataType.INT64.np_dtype())
np_tablet_ = NumpyTablet(
  "root.sg_test_01.d_02", measurements_, data_types_, np_values_, np_timestamps_
)
session.insert_tablet(np_tablet_)
  • 插入多个 Tablet
session.insert_tablets(tablet_lst)
  • 插入一个 Record,一个 Record 是一个设备一个时间戳下多个测点的数据。
session.insert_record(device_id, timestamp, measurements_, data_types_, values_)
  • 插入多个 Record
session.insert_records(
    device_ids_, time_list_, measurements_list_, data_type_list_, values_list_
    )
  • 插入同属于一个 device 的多个 Record
session.insert_records_of_one_device(device_id, time_list, measurements_list, data_types_list, values_list)

带有类型推断的写入

当数据均是 String 类型时,我们可以使用如下接口,根据 value 的值进行类型推断。例如:value 为 “true” ,就可以自动推断为布尔类型。value 为 “3.2” ,就可以自动推断为数值类型。服务器需要做类型推断,可能会有额外耗时,速度较无需类型推断的写入慢

session.insert_str_record(device_id, timestamp, measurements, string_values)

对齐时间序列的写入

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

  • insert_aligned_record
  • insert_aligned_records
  • insert_aligned_records_of_one_device
  • insert_aligned_tablet
  • insert_aligned_tablets

IoTDB-SQL 接口

  • 执行查询语句
session.execute_query_statement(sql)
  • 执行非查询语句
session.execute_non_query_statement(sql)

对 Pandas 的支持

我们支持将查询结果轻松地转换为 Pandas Dataframe (opens new window)。

SessionDataSet 有一个方法.todf(),它的作用是消费 SessionDataSet 中的数据,并将数据转换为 pandas dataframe。

例子:

from iotdb.Session import Session

ip = "127.0.0.1"
port_ = "6667"
username_ = "root"
password_ = "root"
session = Session(ip, port_, username_, password_)
session.open(False)
result = session.execute_query_statement("SELECT ** FROM root")

# Transform to Pandas Dataset
df = result.todf()

session.close()

# Now you can work with the dataframe
df = ...

IoTDB Testcontainer

Python 客户端对测试的支持是基于testcontainers库 (https://testcontainers-python.readthedocs.io/en/latest/index.html) 的,如果您想使用该特性,就需要将其安装到您的项目中。

要在 Docker 容器中启动(和停止)一个 IoTDB 数据库,只需这样做:

class MyTestCase(unittest.TestCase):

    def test_something(self):
        with IoTDBContainer() as c:
            session = Session("localhost", c.get_exposed_port(6667), "root", "root")
            session.open(False)
            result = session.execute_query_statement("SHOW TIMESERIES")
            print(result)
            session.close()

默认情况下,它会拉取最新的 IoTDB 镜像 apache/iotdb:latest进行测试,如果您想指定待测 IoTDB 的版本,您只需要将版本信息像这样声明:IoTDBContainer("apache/iotdb:0.12.0"),此时,您就会得到一个0.12.0版本的 IoTDB 实例。

thrift rpc 接口连接 IoTDB 示例

在 Windows 和 Linux 上操作几乎是一样的,但要注意路径分隔符等不同之处。

依赖

首选 Python3.7 或更高版本。

必须安装 thrift(0.11.0 或更高版本)才能将 thrift 文件编译为 Python 代码。下面是官方的安装教程,最终,您应该得到一个 thrift 可执行文件。

http://thrift.apache.org/docs/install/

在开始之前,您还需要在 Python 环境中安装requirements_dev.txt中的其他依赖:

pip install -r requirements_dev.txt

编译 thrift 库并调试

在 IoTDB 源代码文件夹的根目录下,运行mvn clean generate-sources -pl client-py -am

这个指令将自动删除iotdb/thrift中的文件,并使用新生成的 thrift 文件重新填充该文件夹。

这个文件夹在 git 中会被忽略,并且永远不应该被推到 git 中!

注意不要将iotdb/thrift上传到 git 仓库中 !

Session 客户端 & 使用示例

我们将 thrift 接口打包到client-py/src/iotdb/session.py中(与 Java 版本类似),还提供了一个示例文件client-py/src/SessionExample.py来说明如何使用 Session 模块。请仔细阅读。

另一个简单的例子:

from iotdb.Session import Session

ip = "127.0.0.1"
port_ = "6667"
username_ = "root"
password_ = "root"
session = Session(ip, port_, username_, password_)
session.open(False)
zone = session.get_time_zone()
session.close()

测试

请在tests文件夹中添加自定义测试。

要运行所有的测试,只需在根目录中运行pytest .即可。

注意一些测试需要在您的系统上使用 docker,因为测试的 IoTDB 实例是使用 testcontainers (opens new window) 在 docker 容器中启动的。

其他工具

black (opens new window) 和 flake8 (opens new window) 分别用于自动格式化和 linting。 它们可以通过 black . 或 flake8 . 分别运行。

发版

要进行发版,只需确保您生成了正确的 thrift 代码,运行了 linting 并进行了自动格式化,然后,确保所有测试都正常通过(通过pytest .),最后,您就可以将包发布到 pypi 了。

标签:session,Session,Python,np,lst,IoTDB,Apache,TSDataType,thrift
From: https://blog.51cto.com/u_15123639/7571182

相关文章

  • # yyds干货盘点 # ChatGPT 实用小案例分享——使用Python重命名附件和统计发票合计金
    大家好,我是皮皮。一、前言前几天在【志军】的星球看到了一个有意思的ChatGPT分享,正好喝Python相关的,一起来看看吧。ChatGPT实用小案例分享。如果你在高德或者滴滴上申请过开票,应该知道它们会给我们发一封邮件,发票和行程单都会放在附件中。由于高德是聚合平台,背后有很多网约车平台,......
  • python+playwright 学习-82 Request 对象
    前言每当页面发送网络资源请求时,页面都会发出以下事件序列:page.on("request")当页面发出请求时触发page.on("response")接收到请求的响应状态和标头时触发page.on("requestfinished")当响应主体被下载并且请求完成时发出。如果请求在某个时刻失败,则会发出page.on("requ......
  • python的pandas库:合并数据
    在Pandas中,如果你有两个数据框(DataFrames),且它们的列数和列名都相同,你可以使用concat或merge函数将它们合并。以下是具体步骤:首先,导入Pandas库:importpandasaspd创建两个列数和列名都相同的数据框:df1=pd.DataFrame({'A':['A0','A1','A2','A3'],'B':[�......
  • Python如何获取GPS经纬度信息?
    需求:来了一个GPS设备:获取GPS经纬度信息解决:用serial库步骤:第0步:GPS协议介绍这里简单介绍xxRMC,是推荐最小定位信息。【红色,是要找的字段】$GPRMC 例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50字段0:$GPRMC,语句ID,表明该语句为Recomm......
  • python 生成二维码 插入 excel
    生成二维码defmake_qrcode(data:str,path:str):qr=qrcode.QRCode(version=1,error_correction=qrcode.constants.ERROR_CORRECT_L,box_size=10,border=4)qr.add_data(data)qr.make(fit=True)img=qr.make_i......
  • nicegui:Python 图形界面库,简单好用
    #前言在现代计算机应用程序开发中,图形用户界面(GUI)是用户与程序交互的重要组成部分。然而,GUI开发往往需要大量的代码和复杂的布局,给开发者带来了一定的挑战。在本篇博文中,将介绍nicegui,它是一个简单易用的图形用户界面库,提供了一种简化GUI开发的方式,使开发者能够更快速地构......
  • Python-day15
    1、动态语言classanimal:defeat(self):print('animalwilleat')classdog(animal):defeat(self):print('dogiseatingbone')classcat(animal):defeat(self):print('catiseatingfish')class......
  • Python functools模块:提升函数式编程的5个常用函数
    Python的functools模块是标准库中的一个强大工具,提供了一系列函数,用于优化和增强函数式编程的能力。这些函数可以帮助我们处理函数、操作装饰器、缓存结果等。介绍functools模块中的五个常用函数,包括 partial、wraps、lru_cache、reduce和compose,并提供相关的代码示例,帮助更好......
  • Python中统计、拷贝等方法的使用
    一、统计方法的使用#coding=utf-8#统计出list中正数和负数的个数list=[1,2,3,-1,-2,-3]#count()函数--统计列表中某个元素出现的次数#print(list.count(2))#len()函数--统计列表长度即列表中的元素总个数#print(len(list))list1=[iforiinlistifi>0]print(l......
  • python mimetext 参数
    Pythonmimetext参数详解在Python3中,使用mimetext模块可以轻松地创建电子邮件消息。在发送电子邮件时,我们需要设置邮件的主题、收件人、发件人、正文和附件等信息。而mimetext模块就是用来处理邮件中的文本和附件的。本文将详细介绍mimetext模块中的参数及其用法。安装步骤pip3......