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: 这是具有访问 bucket 权限的 InfluxDB 令牌字符串。

  • bucket: 在客户端元数据中,用户需要提供要与连接一起使用的 InfluxDB bucket;然后每个连接都属于一个特定的 bucket。

下面是此连接过程的示例,其中用户连接到 InfluxDB Cloud 并使用来自名为“INFLUX_TOKEN”的环境的令牌连接到“telegraf-monitoring”bucket

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

从这里,用户可以使用返回的客户端与 InfluxDB 的 SQL 支持进行交互。例如,用户可以执行关于 bucket 的表和模式的查询或查询信息。

执行查询

将查询传递给客户端是将 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 Table。这些表是数组的组,以表格形式表示数据列。该表提供了大量的性能操作和转换为其他数据类型的能力。

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

reader.read_all().to_pandas()

Polars 库的用户也可以直接利用 Arrow 支持。用户可以直接从生成的 Arrow Table 创建 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 库,并立即试用一下!