Skip to main content
在本教程中,您将探索如何使用 ClickHouse 对海量数据运行分析查询。 此外,您还将学习如何使用字典扩充数据,以及如何编写连接查询。

前置条件

完成本教程需要准备:
1

创建表

本教程使用的数据集是纽约市出租车数据集,其中包含数百万次出租车行程的详细信息,涵盖小费金额、通行费、支付方式等列。
  1. 在左侧菜单中选择 SQL 控制台
  2. 点击主页图标旁的 + 选项卡,新建一个查询
  3. 在 SQL 编辑器中输入以下查询,然后点击 运行:
Expandable
2

插入数据

创建好表之后,接下来从 S3 中的 CSV 文件导入纽约市出租车数据。以下命令会从 S3 中的两个文件 trips_1.tsv.gz 和 trips_2.tsv.gz 向 trips 表插入约 2,000,000 行数据:
Expandable
等待数据插入完成,此过程大约会下载 150MB 数据。 数据插入完成后,查看 trips 表中的行数:
您应该会得到 1,999,657 行结果
3

分析数据

数据加载完成后,即可运行一些查询来分析数据。
  • 计算平均小费金额:
  • 按乘客人数计算平均费用:
  • 计算每个社区每天的上车次数:
  • 计算每次行程的时长 (以分钟计) ,然后按行程时长对结果分组:
  • 按小时细分显示每个社区在一天中各时段的上车次数:
4

创建字典

接下来,您将创建一个名为 taxi_zone_dictionary 的字典 (即存储在内存中的键值对映射) ,用于建立位置 ID 与纽约市行政区名称之间的映射关系,其数据来源于一个包含纽约市所有社区的 CSV 文件。 这些位置 ID 对应 trips 表中的 pickup_nyct2010_gid 和 dropoff_nyct2010_gid 列。下表摘录了您将使用的 CSV 文件的部分内容。文件中的 LocationID 列对应 trips 表中的 pickup_nyct2010_gid 和 dropoff_nyct2010_gid 列:运行以下 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 行,即每个社区一行:
5

使用字典执行查询

你可以使用 dictGet 函数 (或其变体) 从字典中获取值。 只需传入字典名称、要获取的值以及键 (在本示例中为 taxi_zone_dictionary 的 LocationID 列) ,即可得到对应的值。 例如,以下查询返回 LocationID 为 132 (即 JFK 机场) 的 Borough:
JFK 位于 Queens (皇后区) 。请注意,检索该值所用的时间几乎为 0:
使用 dictHas 函数可以检查字典中是否存在某个键。例如,以下查询会返回 1 (在 ClickHouse 中表示 “true”) :
以下查询返回 0,因为字典中的 LocationID 不包含值 4567:
在查询中使用 dictGet 函数获取行政区的名称。例如:
此查询按行政区统计了终点为 LaGuardia 或 JFK 机场的出租车行程数。结果如下所示,可以看到有相当多行程的上车社区是未知的:
6

执行连接

最后,编写一些查询,将 taxi_zone_dictionary 与你的 trips 表进行连接。先从一个简单的 JOIN 开始,其作用与上文的机场查询类似:
返回的结果与 dictGet 查询的结果完全相同:
请注意,上述 JOIN 查询的输出与前面使用 dictGetOrDefault 的查询结果相同 (只是不包含 Unknown 值) 。 实际上,ClickHouse 在底层是对 taxi_zone_dictionary 字典调用 dictGet 函数,只不过 SQL 开发人员对 JOIN 语法更为熟悉。
此查询返回小费金额最高的 1000 条行程记录,然后将每一行与该字典进行内连接:
建议只列出查询真正需要的列,避免使用 SELECT *。由于 ClickHouse 按列存储数据,查询的列越少,需要读取、解压和处理的数据量就越少。

后续步骤

如需进一步了解 ClickHouse,请参阅以下文档:
最后修改于 2026年9月28日