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

准备工作

先创建一个虚拟环境:
接下来,我们将安装 JupySQL、IPython 和 Jupyter Lab:
我们可以在 IPython 中使用 JupySQL,可通过运行以下命令来启动:
或者在 Jupyter Lab 中运行:
如果你使用的是 Jupyter Lab,则需要先创建一个笔记本,然后再按照本指南的后续步骤操作。

下载数据集

我们将使用 Jeff Sackmann’s tennis_atp 数据集中的一个,该数据集包含球员信息及其排名随时间变化的元数据。 先从下载排名文件开始:

配置 chDB 和 JupySQL

接下来,导入 chDB 的 dbapi 模块:
接下来我们将创建一个 chDB 连接。 我们持久化的所有数据都会保存到 atp.chdb 目录中:
现在加载 sql magic,并建立与 chDB 的连接:
接下来,我们将显示结果显示限制,以免查询结果被截断:
## 查询 CSV 文件中的数据 我们已经下载了一批带有 atp_rankings 前缀的文件。 下面使用 DESCRIBE 语句来查看 schema:
我们也可以直接对这些文件执行 SELECT 查询,看看数据是什么样子:
数据格式有点奇怪。 我们先把这个日期清理一下,再使用 REPLACE 子句返回清理后的 ranking_date

将 CSV 文件导入 chDB

现在,我们要将这些 CSV 文件中的数据存储到表中。 默认数据库不会将数据持久化到磁盘,因此我们需要先创建另一个数据库:
现在我们将创建一个名为 rankings 的表,其 schema 将根据 CSV 文件中数据的结构推断得出:
我们来快速查看一下表中的数据:
看起来不错——输出结果和预期一样,与直接查询 CSV 文件时相同。 接下来,我们对球员元数据执行相同的流程。 这次所有数据都在一个 CSV 文件中,因此我们来下载这个文件:
然后根据 CSV 文件中的内容创建一个名为 players 的表。 我们还会清理 dob 字段,将其转换为 Date32 类型。
在 ClickHouse 中,Date 类型只支持 1970 年及之后的日期。由于 dob 列包含早于 1970 年的日期,因此我们将改用 Date32 类型。
运行完成后,我们可以查看已摄取的数据:

查询 chDB

数据摄取已完成,现在到了最有意思的部分——查询数据! 网球选手会根据自己在所参加锦标赛中的表现获得积分。 每位选手的积分按 52 周滚动周期统计。 我们将编写一个查询,找出每位选手累计达到的最高积分以及其当时的排名:
有趣的是,这份名单中的一些球员虽然凭借这一总得分并未排在第 1 位,却依然累计了大量得分。

保存查询

我们可以在与 %%sql 魔法命令相同的一行中使用 --save 参数来保存查询。 --no-execute 参数表示将跳过查询执行。
运行已保存查询时,系统会先将其转换为公用表表达式 (CTE) ,然后再执行。 在下面的查询中,我们计算玩家排名为 1 时获得的最高分数:

使用参数查询

我们也可以在查询中使用参数。 参数就是普通变量:
然后,我们就可以在查询中使用 {{variable}} 这种语法。 以下查询会找出首次进入前 10 名到最后一次位列前 10 名之间相隔天数最少的球员:

绘制直方图

JupySQL 也提供了有限的图表绘制功能。 我们可以创建箱线图或直方图。 我们将创建一个直方图,但首先要编写 (并保存) 一个查询,用来计算每位玩家曾达到的前 100 名中的名次。 然后,我们就可以用它来创建一个直方图,统计达到各个名次的玩家人数:
然后,我们可以运行以下内容来创建直方图:
最后修改于 2026年6月19日