概述
前置条件
创建新表
纽约市出租车数据集包含数百万条出租车行程的详细信息,其中包括小费金额、过路费、支付类型等列。创建一个表来存储这些数据。-
连接到 SQL 控制台:
- 对于 ClickHouse Cloud,从下拉菜单中选择一个 service,然后从左侧导航菜单中选择 SQL 控制台。
- 对于自管理 ClickHouse,连接到
https://_hostname_:8443/play的 SQL 控制台。具体信息请咨询您的 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 | 行政区 | 区域 | service_zone |
|---|---|---|---|
| 1 | EWR | 纽瓦克机场 | EWR |
| 2 | 皇后区 | 牙买加湾 | 行政区地带 |
| 3 | 布朗克斯区 | 阿勒顿/佩勒姆花园 | 行政区地带 |
| 4 | 曼哈顿 | Alphabet City | 黄色区 |
| 5 | 史泰登岛 | Arden Heights | 行政区 |
- 运行以下 SQL 命令,创建一个名为
taxi_zone_dictionary的字典,并从 S3 中的 CSV file 向该字典填充数据。该文件的 URL 为https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv。
将
LIFETIME 设置为 0 会禁用自动更新,以避免向我们的 S3 bucket 发送不必要的流量。在其他情况下,你可能需要采用不同的配置。详情请参见 使用 LIFETIME 刷新字典数据。-
验证是否成功。以下应返回 265 行,即每个社区一行:
-
使用
dictGet函数 (及其变体) 从字典中获取值。你需要传入字典名称、要获取的值以及键 (在本示例中,即taxi_zone_dictionary的LocationID列) 。 例如,以下查询会返回LocationID为 132 的Borough,即对应 JFK 机场) :JFK 位于皇后区。请注意,取回该值所需的时间几乎为 0: -
使用
dictHas函数检查某个键是否存在于字典中。例如,以下查询会返回1(在 ClickHouse 中表示 “true”) : -
以下查询返回 0,因为 4567 不是该字典中
LocationID的值: -
在查询中使用
dictGet函数获取某个行政区的名称。例如:此查询按 borough 汇总了终点为 LaGuardia 或 JFK 机场的出租车行程数量。结果如下所示,请注意,有相当多的行程其上车所在社区未知:
执行 join
编写一些将taxi_zone_dictionary 与 trips 表进行 join 的查询。-
先从一个简单的
JOIN开始,它的作用与上面的机场查询类似:返回结果与dictGet查询完全相同:
请注意,上述
JOIN 查询的输出与前面使用 dictGetOrDefault 的查询相同 (只是其中不包含 Unknown 值) 。在底层,ClickHouse 实际上会对 taxi_zone_dictionary 字典调用 dictGet 函数,但对 SQL 开发者来说,JOIN 语法更熟悉。- 此查询会先返回小费金额最高的 1000 次行程对应的行,然后将每一行与该字典执行内连接:
一般来说,我们会避免在 ClickHouse 中频繁使用
SELECT *。你应该只检索实际需要的列。后续步骤
- ClickHouse 中的主索引简介:了解 ClickHouse 如何使用稀疏主索引在查询时高效定位相关数据。
- 集成外部数据源:查看数据源集成选项,包括文件、Kafka、PostgreSQL、数据管道等。
- 在 ClickHouse 中可视化数据:将你常用的 UI/BI 工具连接到 ClickHouse。
- SQL 参考:浏览 ClickHouse 中可用于转换、处理和分析数据的 SQL 函数。