InfluxDB SQL 查询与 Python
作者:Josh Powers / 用例, 开发者
2023 年 2 月 21 日
导航至
最近,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 Cloud 和 Python Flight SQL 库,并立即试用一下!