跳到主要内容
跳到主要内容

JupySQL 和 chDB

JupySQL 是一个 Python 库,可以让你在 Jupyter 笔记本和 IPython shell 中运行 SQL。在本指南中,我们将学习如何使用 chDB 和 JupySQL 查询数据。

设置

首先,让我们创建一个虚拟环境:

然后,我们将安装 JupySQL、IPython 和 Jupyter Lab:

我们可以在 IPython 中使用 JupySQL,通过运行以下命令启动:

或者在 Jupyter Lab 中,通过运行:

备注

如果您使用的是 Jupyter Lab,您需要先创建一个笔记本,然后再继续后面的指南。

下载数据集

我们将使用 Jeff Sackmann 的 tennis_atp 数据集,其中包含有关球员及其排名的元数据。让我们开始下载排名文件:

配置 chDB 和 JupySQL

接下来,让我们导入 chDB 的 dbapi 模块:

我们将创建一个 chDB 连接。任何我们持久化的数据将被保存到 atp.chdb 目录:

现在让我们加载 sql 魔法并创建一个到 chDB 的连接:

接下来,我们将显示输出限制,以便查询的结果不会被截断:

在 CSV 文件中查询数据

我们已经下载了一些以 atp_rankings 为前缀的文件。让我们使用 DESCRIBE 子句来了解模式:

我们还可以编写一个 SELECT 查询,直接针对这些文件,以查看数据的样子:

数据的格式有点奇怪。让我们清理那日期,并使用 REPLACE 子句返回清理后的 ranking_date

将 CSV 文件导入 chDB

现在我们要将这些 CSV 文件中的数据存储在一个表中。默认数据库不会在磁盘上持久化数据,因此我们需要先创建另一个数据库:

现在我们要创建一个名为 rankings 的表,其模式将基于 CSV 文件中数据的结构:

让我们快速检查一下我们表中的数据:

看起来很好,输出与直接查询 CSV 文件时的结果是一样的。

我们将对球员元数据进行同样的处理。这次数据都在一个单独的 CSV 文件中,因此让我们下载该文件:

接下来,根据 CSV 文件内容创建一个名为 players 的表。我们还将清理 dob 字段,使其成为 Date32 类型。

在 ClickHouse 中,Date 类型只支持从 1970 年开始的日期。由于 dob 列包含 1970 年之前的日期,因此我们将使用 Date32 类型。

完成后,我们可以查看我们所摄取的数据:

查询 chDB

数据导入完成,现在是有趣的部分 - 查询数据!

网球选手根据他们在比赛中的表现获得积分。每个选手在 52 周滚动周期内的积分。我们将编写一个查询,找到每个选手累计的最高积分,以及他们当时的排名:

有趣的是,这个列表中的一些选手在积分总数上并没有成为第一。

保存查询

我们可以使用 --save 参数将查询保存到与 %%sql 魔法相同的行上。--no-execute 参数表示将跳过查询执行。

当我们运行一个保存的查询时,它将被转换为公共表表达式(CTE)然后执行。在下面的查询中,我们计算当选手排名第一时所获得的最高积分:

带参数查询

我们还可以在查询中使用参数。参数只是普通变量:

然后我们可以在查询中使用 {{variable}} 语法。以下查询找到前 10 名中,选手首次和最后一次排名的日期之间天数最少的选手:

绘制直方图

JupySQL 还具有有限的图表功能。我们可以创建箱线图或直方图。

我们将创建一个直方图,但首先让我们编写(并保存)一个计算每个选手在前 100 名中所获得的排名的查询。我们将能够使用此查询创建一个直方图,以计算每个排名的选手数量:

然后我们可以通过运行以下命令创建一个直方图:

ATP 数据集中玩家排名的直方图