InfluxDB SQL 查询与 Python

导航到

最近,InfluxData 在 InfluxDB Cloud 中宣布支持 SQL。现在,用户可以使用熟悉的 SQL 查询来探索和分析他们的时间序列数据。SQL 支持与 Apache Arrow 的使用一起引入。

Apache Arrow 是一个开源项目,用作 InfluxDB SQL 支持的基础。Arrow 提供数据表示、存储格式、查询处理和网络传输层。Apache Flight SQL 通过 SQL 提供与 Arrow 交互的方法。

Flight SQL DB API 库为使用 Python 与 Apache Flight SQL 交互的用户提供无缝的用户体验。此库可以直接与支持 SQL 的 InfluxDB 一起使用。

以下是一个使用库和 InfluxDB Cloud 的端到端示例。需要执行其他操作(如插入数据、使用 Flux 查询或任何其他 API 请求)的用户可以继续使用现有的 influxdb-client-python 客户端库。

注意:FlightSQL 对于编写适用于支持它的不同数据库的数据库无关代码很有用。这正是本文介绍的方法。例如,如果您正在创建可能会查询不同类型数据库的 UI 或其他用户体验,如果您的意图是 使用 InfluxDB,我们建议直接使用上游 Flight 库,因为它们具有更简单的依赖关系,并支持 两者 InfluxQL 和 SQL。

安装库

该库已发布在 PyPI 上,以便易于安装

pip install flightsql-dbapi

要使用该库,用户需要在他们的代码中导入 FlightSQLClient

from flightsql import FlightSQLClient

连接到 InfluxDB Cloud

要创建一个与 InfluxDB 交互的客户端,用户需要提供以下三部分信息

  • host: InfluxDB Cloud 实例的主机名 —— 注意这不需要协议(例如,“https://”)或端口(例如,8086)。底层库构建完整的连接字符串。

  • token: 这是访问存储桶的 InfluxDB token 字符串。

  • bucket: 在客户端元数据中,用户需要提供要使用连接的 InfluxDB 存储桶;每个连接都属于特定的存储桶。

以下是连接过程的示例,其中用户连接到 InfluxDB Cloud,并使用名为“INFLUX_TOKEN”的环境中的令牌连接到“telegraf-monitoring”存储桶

client = FlightSQLClient(
    host="us-east-1-1.aws.cloud2.influxdata.com",
    token=os.environ["INFLUX_TOKEN"],
    metadata={"bucket-name": "telegraf-monitoring"},
)

从这里,用户可以使用返回的客户端与 InfluxDB 的 SQL 支持进行交互。例如,用户可以对桶的表和架构执行查询或查询相关信息。

执行查询

将查询传递给客户端是一个简单的过程,即将 SQL 查询字符串传递给 execute() 函数。然而,以下步骤是 Flight SQL 独有的,它需要从端点获取一个票据。

info = client.execute("select * from cpu limit 10")
reader = client.do_get(info.endpoints[0].ticket)

在 Apache Flight SQL 中,一旦查询被传递到服务器,服务器就会返回一个 FlightInfo 对象。该对象包含一个端点列表,描述了包含查询结果的位置。在 InfluxDB Cloud 的情况下,将只有一个端点。然后客户端可以收集来自单个端点票据的信息以获取查询结果。

查询结果处理

客户端的响应类型为 FlightStreamReader。这使用户能够流式传输数据,以避免内存溢出并提高效率。

for batch in reader:
    print(batch)

如果用户查询的结果有限,他们可以使用 read_all() 函数将所有数据块收集到一个表(Table)中。

data = reader.read_all()

这个函数的返回值是一个 PyArrow 表。这些表是表示表格数据列的数组的组合。该表提供了大量的性能操作和转换到其他数据类型的能力。

例如,用户可以将表直接转换为 Pandas DataFrame。这使用户能够快速使用强大的 Pandas 库来操纵、转换和分析他们的数据。

reader.read_all().to_pandas()

使用 Polars 库的用户也可以直接利用 Arrow 的支持。用户可以直接从结果 Arrow 表创建一个 Polars DataFrame

polars.from_table(reader.read_all())

架构和表

当使用 SQL 时,了解可用的架构或表很有帮助。当与 InfluxDB Cloud 一起工作时,用户可以使用以下脚本来收集表信息。

info = client.get_tables()
tables = client.do_get(info.endpoints[0].ticket).read_all()

或者以下脚本来获取完整架构。

info = client.get_db_schemas()
schema = client.do_get(info.endpoints[0].ticket).read_all()

由于表和架构信息相对较小,这里使用 read_all() 可以立即获取数据。

今天尝试使用 InfluxDB 和 Python 的 SQL

本文展示了用户如何利用 Python Flight SQL 库连接并从 InfluxDB Cloud 中检索数据,该库由 IOx 驱动。现在,用户可以利用熟悉的 SQL 查询来使用领先的时序数据库,并使用 Python 进行报告。

考虑您可以使用带有 SQL 支持的 InfluxDB CloudPython Flight SQL 库 的地方,并尝试一下!