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

准备工作

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

下载数据集

我们将使用纽约市出租车数据集,其中包含约 300 万条出租车行程记录,以及每次行程的车费、小费和上车社区信息。 这些行程记录分布在多个 TSV 文件中,因此先下载这些文件:

配置 chDB 和 JupySQL

接下来,导入 chDB 的 dbapi 模块:
接下来我们将创建一个 chDB 连接。 我们持久化的所有数据都会保存到 taxi.chdb 目录中:
现在加载 sql 魔法命令,并建立与 chDB 的连接:
接下来,我们将显示结果显示限制,以免查询结果被截断:

查询 TSV 文件中的数据

我们下载了一批以 trips_ 为前缀的文件。 使用 DESCRIBE 子句查看其 schema:
我们还可以直接针对这些文件编写 SELECT 查询,查看数据内容:
回顾 schema 可以看到,几个与金额相关的列——trip_distance、fare_amount 和 tip_amount——被推断为 String,而不是数值类型。 将数据导入表时,我们会将这些列清理好。

将 TSV 文件导入 chDB

现在,我们将这些 TSV 文件中的数据存储到表中。 默认数据库不会将数据持久化到磁盘,因此需要先创建另一个数据库:
现在,我们将创建一个名为 trips 的表,其 schema 根据 TSV 文件中的数据结构推导而来。 我们将使用 REPLACE 子句将金额相关列转换为 Float64,并使用 transform 函数将数值型 pickup_borocode 列转换为易读的行政区名称:
快速查看一下表中的数据:
刚刚导入了超过 300 万条行程记录——再引入第二张表。 纽约市出租车和豪华轿车委员会将全市划分为出租车区域,一个查找文件将每个区域映射到其所属行政区。 下载该文件:
然后基于 CSV 文件的内容创建一个名为 zones 的表:
运行完成后,我们可以查看已摄取的数据:

查询 chDB

数据摄取已完成,现在到了最有趣的部分——查询数据! 每个行政区包含的出租车区域数量各不相同。 我们将编写一个查询,联接这两个表,以找出每个行政区的上车行程数,以及平均每个出租车区域的行程数:
曼哈顿和皇后区的出租车区域数量相同,但曼哈顿的接客量是皇后区的 14 倍以上。

保存查询

可以在与 %%sql 魔法命令同一行使用 --save 参数来保存查询。 --no-execute 参数表示跳过查询执行。
运行已保存的查询时,系统会先将其转换为通用表表达式 (CTE) ,再执行。 在以下查询中,我们计算平均小费最高的社区:
排名靠前的社区行程数都很少,因此一次高额行程就会拉高平均值。 我们把这些社区过滤掉。

使用参数查询

我们也可以在查询中使用参数。 参数就是普通变量:
然后,我们可以在查询中使用 {{variable}} 语法。 以下查询会找出行程次数超过 10,000 次的社区中平均小费最高的社区:
机场接送服务的小费遥遥领先——进城的长途行程花费不菲。

绘制直方图

JupySQL 也提供了有限的图表绘制功能。 我们可以创建箱线图或直方图。 我们将创建一个直方图,但首先要编写 (并保存) 一个查询,返回每次行程中距离小于 20 英里的行程距离。 然后,我们就可以用它来创建一个直方图,统计落入各个距离分桶的行程数量:
然后,我们可以运行以下内容来创建直方图:
大多数行程都是一到三英里的短途,只有少数较长的行程会延伸到机场。