客户端库深入探索:Python(第二部分)
作者:Jay Clifford / 产品, 开发者
2023 年 7 月 28 日
导航至
使用新的 InfluxDB 3.0 Python CLI 和客户端库
好的,我们又回来了,这次是第二部分!上次我们讨论了用于 InfluxDB 3.0 的新的社区 Python 库。如果您错过了,也可以观看视频形式。
现在是第二部分,让我们来谈谈一个插件应用程序,它使用客户端库作为其开发的核心,即 InfluxDB 3.0 Python CLI。
Python CLI
好的,所以按照之前的相同格式,构建 CLI 的原因是什么?嗯,主要有两个原因:
-
我们想为用户提供一个数据浏览工具,该工具利用了新的 Flight 端点。Python 使我们有机会在投入更多精力开发更强大的 CLI 产品之前快速进行原型设计。它还使我们能够利用一些有趣的数据操作库,这些库可以扩展 Python CLI 的范围。
-
我们想要一种可靠的方法来测试新创建的 InfluxDB 3.0 Python 客户端库,您会看到其中使用了大部分工具和功能。
安装
让我们来谈谈安装过程,因为我必须承认,除非您每天都使用 Python,否则 Python 并不能提供最用户友好的打包和部署方法。我建议首先在 Python 虚拟环境中安装 CLI 以进行测试。
$ python3 -m venv ./.venv
$ source .venv/bin/activate
$ pip install –upgrade pip
$ pip install influxdb3-python-cli
这组命令创建了我们的虚拟 Python 环境,激活它,更新了我们的 Python 包安装程序,最后安装了新的 CLI。
如果您想从 Python 虚拟环境毕业并将 CLI 移动到您的路径,您可以使用 sudo 安装(您必须在此处小心,不要导致包的权限问题)。
sudo python3 -m pip install influxdb3-python-cli
创建 CLI 配置
您要做的第一件事是创建连接配置。此功能的作用类似于当前的 InfluxDB influx CLI,通过保存您的 InfluxDB 连接凭据以供稍后使用。
influx3 create config \
--name="poke-dex" \
--database="pokemon-codex" \
--host="us-east-1-1.aws.cloud2.influxdata.com" \
--token="<your token>" \
--org="<your org ID>"
–name | 用于描述您的连接配置的名称。这必须是唯一的。 |
–token | 这为客户端提供身份验证,以便从 InfluxDB Cloud Serverless 或 Dedicated 读取和写入。注意:如果您希望使用这两个功能,则需要具有读取和写入身份验证的令牌。 |
–host | InfluxDB 主机 — 这应该只是域名,不带协议 (https://) |
–org | Cloud Serverless 仍然需要用户的组织 ID 才能将数据写入 3.0。Dedicated 用户只需使用任意字符串即可。 |
–database | 您希望从中查询和写入的数据库。 |
配置命令
配置命令还存在用于激活、更新、删除和列出当前活动配置
|
update 子命令更新现有配置。需要 --name 参数来指定要更新的配置。所有其他参数(--host、--token、--database、--org、--active)都是可选的。 |
|
use 子命令将特定配置设置为活动配置。需要 --name 参数来指定要使用的配置。 |
|
delete 子命令删除配置。需要 --name 参数来指定要删除的配置。 |
|
list 子命令列出所有配置。 |
写入和查询
您可以使用 CLI 直接调用应用程序,然后是您希望运行的命令,或者通过交互式 REPL 运行它。我个人认为 REPL 方法提供了更好的流程,所以让我们演示一下一些功能。
创建配置后,您只需输入以下内容即可激活 REPL
influx3
这将引导至
influx3
InfluxDB 3.0 CLI.
(>)
查询
让我们首先看一下查询选项。在 REPL 中,您有 3 个查询选项:SQL、InfluxQL 和 chatGPT(稍后会详细介绍)。让我们进入 SQL REPL 并针对我们在上一篇博客中生成的 Trainer 数据运行一个基本查询
InfluxDB 3.0 CLI.
(>) sql
(sql >) SELECT * FROM caught
现在我通常不建议在没有某种基于时间的 WHERE 子句的情况下进行查询,但我想突出显示 CLI 如何处理大型数据集。它使用 Python 客户端库中的 mode = chunk
将大型数据集分解为可管理 Arrow 批次。从那里我们有三个选项。
-
我们可以点击 TAB 查看下一个数据部分(如果存在)。
-
按 F 将当前的 Arrow 批次保存为我们选择的文件类型(JSON、CSV、Parquet、ORC、Feather)。
-
按 CTRL-C 返回 SQL REPL。
让我们看一下选项 2
| 3961 | 82 | Venusaur | 83 | 80 | 0003 | 12 | 7 | 80 | 2023-07-06 13:41:36.588000 | ash | Grass | Poison |
| 3962 | 64 | Dratini | 45 | 41 | 0147 | 6 | 7 | 50 | 2023-07-06 14:30:32.519000 | jessie | Dragon | |
Press TAB to fetch next chunk of data, or F to save current chunk to a file
Enter the file name with full path (e.g. /home/user/sample.json): ~/Desktop/all-trainer-data.csv
Data saved to ~/Desktop/all-trainer-data.csv.
以下是创建的 CSV 文件的示例
"attack","caught","defense","hp","id","level","num","speed","time","trainer","type1","type2"
49,"Bulbasaur",49,45,"0001",12,"1",45,2023-07-06 14:30:41.886000000,"ash","Grass","Poison"
62,"Ivysaur",63,60,"0002",7,"1",60,2023-07-06 14:30:32.519000000,"ash","Grass","Poison"
62,"Ivysaur",63,60,"0002",8,"1",60,2023-07-06 14:30:38.519000000,"ash","Grass","Poison"
一旦我们到达数据集的末尾,它会提示我们按 ENTER 返回 SQL REPL。请记住,如果您觉得您正在永远按 TAB,您可以随时使用 CTRL-C 退出查询。
现在,让我们看一下 InfluxQL REPL 的一个更有趣的示例
(sql >) exit
(>) influxql
(influxql >) SELECT count(caught) FROM caught WHERE time > now() - 2d GROUP BY trainer
| | iox::measurement | time | trainer | count |
|---:|:-------------------|:--------------------|:----------|--------:|
| 0 | caught | 1970-01-01 00:00:00 | ash | 625 |
| 1 | caught | 1970-01-01 00:00:00 | brock | 673 |
| 2 | caught | 1970-01-01 00:00:00 | gary | 645 |
| 3 | caught | 1970-01-01 00:00:00 | james | 664 |
| 4 | caught | 1970-01-01 00:00:00 | jessie | 663 |
| 5 | caught | 1970-01-01 00:00:00 | misty | 693 |
(influxql >) SELECT count(caught) FROM caught WHERE time > now() - 2d GROUP BY time(1d),trainer ORDER BY time
| | iox::measurement | time | trainer | count |
|---:|:-------------------|:--------------------|:----------|--------:|
| 0 | caught | 2023-07-05 00:00:00 | ash | nan |
| 1 | caught | 2023-07-06 00:00:00 | ash | 625 |
| 2 | caught | 2023-07-07 00:00:00 | ash | 148 |
| 3 | caught | 2023-07-05 00:00:00 | brock | nan |
| 4 | caught | 2023-07-06 00:00:00 | brock | 673 |
| 5 | caught | 2023-07-07 00:00:00 | brock | 180 |
| 6 | caught | 2023-07-05 00:00:00 | gary | nan |
| 7 | caught | 2023-07-06 00:00:00 | gary | 645 |
| 8 | caught | 2023-07-07 00:00:00 | gary | 155 |
| 9 | caught | 2023-07-05 00:00:00 | james | nan |
| 10 | caught | 2023-07-06 00:00:00 | james | 664 |
| 11 | caught | 2023-07-07 00:00:00 | james | 157 |
| 12 | caught | 2023-07-05 00:00:00 | jessie | nan |
| 13 | caught | 2023-07-06 00:00:00 | jessie | 663 |
| 14 | caught | 2023-07-07 00:00:00 | jessie | 144 |
| 15 | caught | 2023-07-05 00:00:00 | misty | nan |
| 16 | caught | 2023-07-06 00:00:00 | misty | 693 |
| 17 | caught | 2023-07-07 00:00:00 | misty | 178 |
我们将把这个保存为 Parquet 文件以供稍后使用。
写入
从使用 CLI 进行查询转移到写入功能。现在,此功能集不像我希望的那么完善,但它涵盖了基本知识。我们可以进入写入 REPL 并使用行协议将数据写入 InfluxDB,如下所示
(influxql >) exit
(>) write
(write >) caught,id=0115,num=1,trainer=brock attack=125i,caught="KangaskhanMega Kangaskhan",defense=100i,hp=105i,level=13i,speed=100i,type1="Normal" 1688741473083000000
接下来让我们看一下 write_file
功能。为此,我们需要完全退出 REPL,并在调用“influx3”时使用标志命令。让我们将计数结果加载到一个新表中
(write >) exit
(>) exit
Exiting …
influx3 write_file --help
usage: influx3 write_file [-h] --file FILE [--measurement MEASUREMENT] --time TIME [--tags TAGS]
options:
-h, --help show this help message and exit
--file FILE the file to import
--measurement MEASUREMENT
Define the name of the measurement
--time TIME Define the name of the time column within the file
--tags TAGS (optional) array of column names which are tags. Format should be: tag1,tag2
influx3 write_file --file ~/Desktop/count.parquet --time time --tags trainer --measurement summary
这是结果
(influxql >) SELECT count, trainer, time FROM summary
| | iox::measurement | time | count | trainer |
|---:|:-------------------|:--------------------|--------:|:----------|
| 0 | summary | 2023-07-05 00:00:00 | nan | ash |
| 1 | summary | 2023-07-05 00:00:00 | nan | brock |
| 2 | summary | 2023-07-05 00:00:00 | nan | gary |
| 3 | summary | 2023-07-05 00:00:00 | nan | james |
| 4 | summary | 2023-07-05 00:00:00 | nan | jessie |
| 5 | summary | 2023-07-05 00:00:00 | nan | misty |
| 6 | summary | 2023-07-06 00:00:00 | 625 | ash |
| 7 | summary | 2023-07-06 00:00:00 | 673 | brock |
| 8 | summary | 2023-07-06 00:00:00 | 645 | gary |
| 9 | summary | 2023-07-06 00:00:00 | 664 | james |
| 10 | summary | 2023-07-06 00:00:00 | 663 | jessie |
| 11 | summary | 2023-07-06 00:00:00 | 693 | misty |
| 12 | summary | 2023-07-07 00:00:00 | 148 | ash |
| 13 | summary | 2023-07-07 00:00:00 | 180 | brock |
| 14 | summary | 2023-07-07 00:00:00 | 155 | gary |
| 15 | summary | 2023-07-07 00:00:00 | 157 | james |
| 16 | summary | 2023-07-07 00:00:00 | 144 | jessie |
| 17 | summary | 2023-07-07 00:00:00 | 178 | misty |
实验性功能 (ChatGPT)
因此,随着 chatGPT 和 OpenAI 近年来风靡一时,我希望看看他们的 Python 包是否可以使 CLI 受益。有趣的是,它确实如此…… 由于 InfluxDB 自成立以来一直是开源的,chatGPT 已经非常擅长构建 InfluxQL 查询。看看这个例子
(chatgpt >) give me a list of the top 10 caught with an attack higher than 100 from caught
Run InfluxQL query: SELECT * FROM caught WHERE attack > 100 LIMIT 10
| | iox::measurement | time | attack | caught | defense | hp | id | level | num | speed | trainer | type1 | type2 |
|---:|:-------------------|:---------------------------|---------:|:--------------------------|----------:|-----:|-----:|--------:|------:|--------:|:----------|:---------|:--------|
| 0 | caught | 2023-07-06 13:09:36.095000 | 110 | Dodrio | 70 | 60 | 0085 | 19 | 1 | 100 | jessie | Normal | Flying |
| 1 | caught | 2023-07-06 13:09:36.095000 | 125 | Pinsir | 100 | 65 | 0127 | 6 | 1 | 85 | brock | Bug | |
| 2 | caught | 2023-07-06 13:10:53.995000 | 130 | CharizardMega Charizard X | 111 | 78 | 0006 | 6 | 1 | 100 | brock | Fire | Dragon |
| 3 | caught | 2023-07-06 13:10:53.995000 | 150 | BeedrillMega Beedrill | 40 | 65 | 0015 | 12 | 1 | 145 | jessie | Bug | Poison |
| 4 | caught | 2023-07-06 13:10:53.995000 | 102 | Nidoking | 77 | 81 | 0034 | 20 | 1 | 85 | gary | Poison | Ground |
| 5 | caught | 2023-07-06 13:10:53.995000 | 105 | Primeape | 60 | 65 | 0057 | 16 | 1 | 95 | misty | Fighting | |
| 6 | caught | 2023-07-06 13:10:53.995000 | 120 | Golem | 130 | 80 | 0076 | 8 | 1 | 45 | ash | Rock | Ground |
| 7 | caught | 2023-07-06 13:10:53.995000 | 105 | Muk | 75 | 105 | 0089 | 5 | 1 | 50 | brock | Poison | |
| 8 | caught | 2023-07-06 13:10:53.995000 | 105 | Muk | 75 | 105 | 0089 | 19 | 1 | 50 | james | Poison | |
| 9 | caught | 2023-07-06 13:10:53.995000 | 105 | Muk | 75 | 105 | 0089 | 16 | 2 | 50 | james | Poison | |
此功能目前仅使用 ChatGPT 3.5,并且需要 OpenAPI 令牌。如果您想了解如何使用此功能的说明,请查看 README 的这一部分。
未来展望
Python CLI 的未来是光明的,因为我们的开发团队正在推进 InfluxDB 3.0 的工具开发。目前,其范围是将其作为 Python 开发人员和那些想要易于扩展的 CLI 的人的插件工具。以下是我目前的项目任务清单:
功能 | 状态 |
---|---|
改进 OpenAI 功能
|
待办事项 |
找到更好的打包和分发方式。目前正在考虑 Pyinstaller 作为一个选项。 | 待办事项 |
扩展的写入功能。 | 待办事项 |
提供查询后探索支持(Pandas 函数) | 待办事项 |
集成 delta sharing | 待办事项 |
总结
这就是第二部分,完成!我非常享受撰写关于 Python 客户端库和 CLI 的这个博客系列。深度参与检查使撰写关于它们的内容更加令人兴奋和容易。我希望这些博客能激励您加入我们新的基于社区的库和工具。如果您想讨论如何参与,您可以通过 Slack 或 Discourse 与我联系。