客户端库深入探索:Python(第二部分)

导航至

InfluxDB-3-Python

使用新的 InfluxDB 3.0 Python CLI 和客户端库

好的,我们又回来了,这次是第二部分!上次我们讨论了用于 InfluxDB 3.0 的新的社区 Python 库。如果您错过了,也可以观看视频形式


现在是第二部分,让我们来谈谈一个插件应用程序,它使用客户端库作为其开发的核心,即 InfluxDB 3.0 Python CLI

Python CLI

好的,所以按照之前的相同格式,构建 CLI 的原因是什么?嗯,主要有两个原因:

  1. 我们想为用户提供一个数据浏览工具,该工具利用了新的 Flight 端点。Python 使我们有机会在投入更多精力开发更强大的 CLI 产品之前快速进行原型设计。它还使我们能够利用一些有趣的数据操作库,这些库可以扩展 Python CLI 的范围。

  2. 我们想要一种可靠的方法来测试新创建的 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 ServerlessDedicated 读取和写入。注意:如果您希望使用这两个功能,则需要具有读取和写入身份验证的令牌。
–host InfluxDB 主机 — 这应该只是域名,不带协议 (https://)
–org Cloud Serverless 仍然需要用户的组织 ID 才能将数据写入 3.0。Dedicated 用户只需使用任意字符串即可。
–database 您希望从中查询和写入的数据库。

配置命令

配置命令还存在用于激活、更新、删除和列出当前活动配置

influx3.py config update --name="poke-dex" --host="new-host.com"
update 子命令更新现有配置。需要 --name 参数来指定要更新的配置。所有其他参数(--host、--token、--database、--org、--active)都是可选的。
influx3.py config use --name="poke-dex"
use 子命令将特定配置设置为活动配置。需要 --name 参数来指定要使用的配置。
influx3.py config delete --name="poke-dex"
delete 子命令删除配置。需要 --name 参数来指定要删除的配置。
influx3.py config list
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 批次。从那里我们有三个选项。

  1. 我们可以点击 TAB 查看下一个数据部分(如果存在)。

  2. F 将当前的 Arrow 批次保存为我们选择的文件类型(JSON、CSV、Parquet、ORC、Feather)。

  3. 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 功能
  • 升级到 chatgpt 4
  • 添加调用函数
  • 扩展到 SQL
待办事项
找到更好的打包和分发方式。目前正在考虑 Pyinstaller 作为一个选项。 待办事项
扩展的写入功能。 待办事项
提供查询后探索支持(Pandas 函数) 待办事项
集成 delta sharing 待办事项

总结

这就是第二部分,完成!我非常享受撰写关于 Python 客户端库和 CLI 的这个博客系列。深度参与检查使撰写关于它们的内容更加令人兴奋和容易。我希望这些博客能激励您加入我们新的基于社区的库和工具。如果您想讨论如何参与,您可以通过 SlackDiscourse 与我联系。