高级教程
概述
了解如何使用纽约市出租车示例数据集在 ClickHouse 中导入和查询数据。
前提条件
您需要访问正在运行的 ClickHouse 服务才能完成此教程。有关说明,请参阅 快速入门 指南。
创建新表
纽约市出租车数据集包含有关数百万次出租车乘车的详细信息,列包括小费金额、税费、支付类型等。创建一个表来存储这些数据。
-
连接到 SQL 控制台:
- 对于 ClickHouse Cloud,从下拉菜单中选择一个服务,然后从左侧导航菜单中选择 SQL 控制台。
- 对于自管理的 ClickHouse,连接到 SQL 控制台
https://_hostname_:8443/play
。请与您的 ClickHouse 管理员确认详细信息。
-
在
default
数据库中创建以下trips
表:
添加数据集
现在您已经创建了一个表,从 S3 中的 CSV 文件中添加纽约市出租车数据。
- 以下命令从 S3 中的两个不同文件
trips_1.tsv.gz
和trips_2.tsv.gz
向您的trips
表插入约 2,000,000 行:
-
等待
INSERT
完成。下载 150 MB 的数据可能需要一些时间。 -
插入完成后,验证它是否成功:
该查询应返回 1,999,657 行。
分析数据
运行一些查询来分析数据。探索以下示例或尝试您自己的 SQL 查询。
- 计算平均小费金额:
预期输出
- 根据乘客数量计算平均费用:
预期输出
passenger_count
的范围是 0 到 9:
- 计算每个社区每天的接送次数:
预期输出
- 计算每次行程的时长(分钟),然后按行程时长分组结果:
预期输出
- 显示每个社区按小时划分的接送次数:
预期输出
- 获取前往拉瓜迪亚或 JFK 机场的行程:
预期输出
创建字典
字典是存储在内存中的键值对映射。有关详细信息,请参见 字典
创建一个与您 ClickHouse 服务中的表相关联的字典。 表和字典基于包含纽约市每个社区行的 CSV 文件。
这些社区映射到五个纽约市行政区(布朗克斯、布鲁克林、曼哈顿、皇后区和史坦顿岛)以及纽瓦克机场(EWR)的名称。
以下是您用于表格的 CSV 文件的摘录。文件中的 LocationID
列映射到您的 trips
表中的 pickup_nyct2010_gid
和 dropoff_nyct2010_gid
列:
LocationID | Borough | Zone | service_zone |
---|---|---|---|
1 | EWR | 纽瓦克机场 | EWR |
2 | 皇后区 | 牙买加湾 | 行政区 |
3 | 布朗克斯 | 阿莱顿/佩勒姆花园 | 行政区 |
4 | 曼哈顿 | 字母城市 | 黄色区 |
5 | 史坦顿岛 | 阿登高地 | 行政区 |
- 运行以下 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 位于皇后区。请注意,检索值的时间几乎为 0:
- 使用
dictHas
函数检查字典中是否存在某个键。例如,以下查询返回1
(在 ClickHouse 中表示 "true"):
- 以下查询返回 0,因为 4567 不是字典中
LocationID
的值:
- 在查询中使用
dictGet
函数检索行政区名称。例如:
此查询汇总了在拉瓜迪亚或 JFK 机场结束的每个行政区的出租车数量。结果如下,注意有相当多的行程来自未知接送社区:
执行连接
编写一些将 taxi_zone_dictionary
与您的 trips
表连接的查询。
- 从一个简单的
JOIN
开始,其作用类似于上面的机场查询:
响应与前面的 dictGet
查询看起来相同:
请注意,上述 JOIN
查询的输出与之前使用 dictGetOrDefault
的查询相同(只是不包括 Unknown
值)。在后台,ClickHouse 实际上调用 taxi_zone_dictionary
字典的 dictGet
函数,但 JOIN
语法对 SQL 开发人员更为熟悉。
- 此查询返回小费金额最高的 1000 次行程的行,随后对每行与字典执行内部连接:
通常,我们在 ClickHouse 中避免频繁使用 SELECT *
。您应该仅检索实际需要的列。
下一步
通过以下文档进一步了解 ClickHouse:
- ClickHouse 中主索引的介绍:了解 ClickHouse 如何使用稀疏主索引在查询期间有效定位相关数据。
- 集成外部数据源:查看数据源集成选项,包括文件、Kafka、PostgreSQL、数据管道等。
- 在 ClickHouse 中可视化数据:将您最喜欢的 UI/BI 工具连接到 ClickHouse。
- SQL 参考:浏览 ClickHouse 中用于转换、处理和分析数据的 SQL 函数。