客户库Deep Dive:Python(第2部分)
#python #chatgpt #influxdb #arrow

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

Jay Clifford

"banner"

好吧,我们回来了第2部分!上次我们讨论了新的Community Python图书馆,用于InfuxdB 3.0。让我们谈谈使用客户端库作为其开发的核心InfluxDB 3.0 Python CLI

Python Cli

好吧,遵循与以前相同的格式,建造CLI的原因是什么?好吧,有两个主要原因:

  1. 我们想为用户提供一个利用新飞行端点的数据浏览工具。 Python为我们提供了在我们投资更强大的CLI产品之前快速原型的机会。它还使我们能够利用一些有趣的数据操纵库,这些库可以扩展Python CLI的范围。
  2. 我们想要一种可靠的方法来测试新创建的InfluxDB 3.0 Python Client library,因为您将看到使用中的大多数工具和功能。

安装

让我们谈谈安装过程,因为我必须承认,除非您每天使用它,否则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,通过保存您的连接凭证供infuxdb稍后使用。


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>"

名称 名称描述您的连接配置。这一定是唯一的。
token 这为客户提供了从infuxdb cloud ServerlessDedicated读写的身份验证。注意:如果您想使用这两个功能,则需要带有读取写下身份验证的令牌。
主持人 infuxdb主机 - 这只能是没有协议的域(https://)
org Cloud无服务器仍然需要用户的组织ID来将数据写入3.0。专用的用户只能使用任意字符串。
数据库 您希望从中查询并写入的数据库。

配置命令

配置命令也存在激活,更新,删除和列表当前活动配置:

````bash

Influx3.py配置更新-name =“ poke-dex” -honst =“ new-host.com”

````````

更新子命令更新现有配置。需要 - 名称参数才能指定要更新的配置。所有其他参数( - 主持, - token, - 数据库,-org,Active)都是可选的。
````bash

Influx3.py配置使用-name =“ poke-dex”

````````

使用子命令将特定的配置设置为有效配置。需要 - 名称参数来指定要使用的配置。
````bash

infux3.py config delete -name =“ poke-dex”

````````

删除子命令删除配置。需要 - 名称参数才能指定要删除的配置。
````bash

Influx3.py配置列表

````````

列表子命令列出了所有配置。

写作和查询

您可以使用CLI直接调用该应用程序,然后使用您希望运行的命令,也可以通过交互式REPL运行。我个人认为,复制方法提供了更好的流程,所以让演示一些功能。

创建了配置后,您只需输入以下即可激活repl:


influx3

导致:


influx3

InfluxDB 3.0 CLI.

(>)

询问

让我们首先查看查询选项。在REPL中,您有3个查询选项:SQL,InfluxQl和Chatgpt(稍后再详细介绍)。让我们介入SQL Repp,并针对上一个博客中生成的培训师数据运行基本查询:


InfluxDB 3.0 CLI.

(>) sql

(sql >) SELECT * FROM caught

现在,我通常不建议您不用某种形式的基于时间的子句进行查询,但是我想突出显示CLI如何处理大型数据集。它使用模式=从Python客户端库中的块来将大型数据集分解为可管理的箭头批次。从那里我们有三个选择。

  1. 我们可以点击** tab **以查看下一个数据,如果存在。
  2. f 将当前的箭头批次保存到我们选择的文件类型(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"

到达数据集的末尾后,它会提示我们按输入**,以便回到SQL REPL中。只需记住,如果您觉得自己一直按** tab **,您总是可以用** ctrl-c。

退出查询。

现在,让我们看一个更有趣的示例,其中infuxql 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进行查询,让我们谈谈写功能。现在,此功能集并不像我想要的那样充实,但它涵盖了基础知识。我们可以使用类似的行协议进入写入数据并将数据写入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功能。为此,我们需要完全退出重录并在调用infux3时使用标志命令。让我们将计数结果加载到一个新表中:


(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受益。有趣的是,由于InfuxdB成立以来一直是开源的,因此Chatgpt在构建流入Ql查询方面已经非常精通。看看这个示例:


(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的这一部分。

未来的希望

我们的开发团队通过用于InfuxDB 3.0的工具向前推进,这对Python CLI来说是光明的。目前,范围是将其作为Python开发人员和想要易于扩展的CLI的螺栓操作工具。这是我目前为该项目的洗衣清单:

功能 状态
提高OpenAI功能:
  • 升级到chatgpt 4
  • 添加呼叫功能
  • 扩展到SQL
找到一种更好的包装和分发方法。目前将Pyinstaller视为一种选择。
扩展写功能。
提供查询后探索支持(PANDAS功能)
整合三角洲共享

包起来

这样就可以了,第2部分完成并撒了灰尘。我真的很喜欢在Python客户库和CLI上写这个博客系列。在检查中拥有如此沉重的手使关于它们的文章更加令人兴奋和容易。我希望这些博客能够激发您加入我们新的基于社区的图书馆和工具。如果您想谈论如何参与,可以通过SlackDiscourse与我联系。