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 名以及最后一次在前 10 名之间天数最少的球员:
绘制直方图
JupySQL 还具有有限的图表功能。我们可以创建箱线图或直方图。
我们将创建一个直方图,但首先让我们编写(并保存)一个计算每个球员在前 100 名中取得的排名的查询。我们将能够利用此查询创建一个计算获得每项排名的球员数量的直方图:
然后,我们可以通过运行以下命令来创建直方图:
