进阶教程
概述
了解如何使用纽约市出租车示例数据集在 ClickHouse 中摄取和查询数据。
前置条件
您需要访问正在运行的 ClickHouse 服务才能完成本教程。有关说明,请参阅快速入门指南。
创建新表
纽约市出租车数据集包含数百万次出租车行程的详细信息,其中的列包括小费金额、过路费、支付方式等。创建一个表来存储这些数据。
-
连接到 SQL 控制台:
- 对于 ClickHouse Cloud,从下拉菜单中选择一个服务,然后在左侧导航菜单中选择 SQL Console。
- 对于自托管的 ClickHouse,在
https://_hostname_:8443/play上连接到 SQL 控制台。请向你的 ClickHouse 管理员确认详细信息。
-
在
default数据库中创建以下trips表:
添加数据集
现在你已经创建了一个表,请从 S3 中的 CSV 文件添加纽约市出租车数据。
-
以下命令会将来自 S3 中两个不同文件(
trips_1.tsv.gz和trips_2.tsv.gz)的大约 2,000,000 行数据插入到你的trips表中: -
等待
INSERT完成。下载这 150 MB 的数据可能需要一点时间。 -
插入完成后,验证是否成功:
此查询应返回 1,999,657 行。
分析数据
运行一些查询来分析数据。探索以下示例或尝试你自己的 SQL 查询。
-
计算平均小费金额:
预期输出
-
按乘客数量计算平均费用:
预期输出
passenger_count的取值范围为 0 到 9: -
计算每天每个社区的上车次数:
预期输出
-
计算每次行程的时长(单位:分钟),然后按行程时长对结果分组:
预期输出
-
按一天中的小时统计各社区的上车次数:
预期输出
-
检索前往 LaGuardia 或 JFK 机场的行程记录:
预期输出
创建字典
字典是一种存储在内存中的键值对映射。有关详细信息,请参阅 字典
在你的 ClickHouse 服务中创建一个与表关联的字典。 该表和字典基于一个 CSV 文件,该文件为纽约市的每个社区包含一行数据。
这些社区会被映射为纽约市五个行政区(Bronx、Brooklyn、Manhattan、Queens 和 Staten Island)以及纽瓦克机场(EWR)的名称。
以下是你正在使用的 CSV 文件的摘录,以表格格式显示。文件中的 LocationID 列映射到 trips 表中的 pickup_nyct2010_gid 和 dropoff_nyct2010_gid 列:
| LocationID | 行政区 | 区域 | service_zone |
|---|---|---|---|
| 1 | EWR | 纽瓦克机场 | EWR |
| 2 | 皇后区 | Jamaica Bay | Boro Zone |
| 3 | 布朗克斯 | Allerton/Pelham Gardens | Boro Zone |
| 4 | 曼哈顿 | Alphabet City | Yellow Zone |
| 5 | 斯塔滕岛 | Arden Heights | Boro Zone |
- 运行以下 SQL 命令,用于创建一个名为
taxi_zone_dictionary的字典,并从 S3 中的 CSV 文件为该字典填充数据。该文件的 URL 为https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv。
将 LIFETIME 设置为 0 会禁用自动更新,以避免对我们的 S3 存储桶产生不必要的流量。在其他情况下,您可能会以不同方式进行配置。有关详细信息,请参阅使用 LIFETIME 刷新字典数据。
-
验证其是否生效。下面的查询应该返回 265 行结果,每个社区对应一行:
-
使用
dictGet函数(或其变体)从字典中获取值。你需要传入字典的名称、要获取的值对应的列名以及键(在我们的示例中是taxi_zone_dictionary的LocationID列)。例如,下面的查询将返回
LocationID为 132 的Borough(对应于 JFK 机场):JFK 位于 Queens 行政区。请注意,检索该值所需的时间几乎为 0:
-
使用
dictHas函数检查某个键是否存在于字典中。例如,下面的查询返回1(在 ClickHouse 中表示“true”): -
The following query returns 0 because 4567 不是字典中
LocationID的任何值: -
使用
dictGet函数在查询中获取行政区名称。例如:此查询按行政区汇总了在拉瓜迪亚机场或 JFK 机场结束的出租车行程数量。结果如下所示,可以看到有相当多的行程其上车所在社区未知:
执行 JOIN 操作
编写一些查询,将 taxi_zone_dictionary 与你的 trips 表关联起来。
-
从一个简单的
JOIN开始,其效果与前面的机场查询类似:返回结果看起来与
dictGet查询完全相同:注意请注意,上述
JOIN查询的结果与之前使用dictGetOrDefault的查询相同(只是未包含Unknown值)。在底层实现上,ClickHouse 实际上为taxi_zone_dictionary字典调用了dictGet函数,但JOIN语法对 SQL 开发者来说更为熟悉。 -
此查询返回小费金额最高的 1000 次行程对应的行,然后对每一行与字典执行 inner join:
注意一般在 ClickHouse 中应尽量避免频繁使用
SELECT *。你应该只检索实际需要的列。
后续步骤
通过以下文档进一步了解 ClickHouse:
- ClickHouse 主索引(Primary Index)简介:了解 ClickHouse 如何使用稀疏主索引在查询期间高效定位相关数据。
- 集成外部数据源:查看数据源集成选项,包括文件、Kafka、PostgreSQL、数据管道等多种方式。
- 在 ClickHouse 中可视化数据:将您常用的 UI/BI 工具连接到 ClickHouse。
- SQL 参考:浏览 ClickHouse 中用于转换、处理和分析数据的 SQL 函数。