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 名中所获得的排名的查询。我们将能够使用此查询创建一个直方图,以计算每个排名的选手数量:
然后我们可以通过运行以下命令创建一个直方图:
