跳转到主要内容

概述

本教程以 [ClickHouse 教程] 为基础,但其中所有查询均通过 pg_clickhouse 运行。

启动 ClickHouse

首先,如果你还没有 ClickHouse 数据库,请先创建一个。一个快速 的入门方式是使用 Docker 镜像:

创建表

让我们借用[ClickHouse 教程]中的示例,使用纽约市出租车数据集创建一个简单的数据库:

添加数据集

然后导入数据:
确认可以查询后,退出客户端:

安装 pg_clickhouse

PGXNGitHub 构建并安装 pg_clickhouse。或者使用 [pg_clickhouse image] 启动一个 Docker 容器;该镜像只是将 pg_clickhouse 添加到 Docker 的 Postgres image 中:

连接 pg_clickhouse

接下来连接到 Postgres:
然后创建 pg_clickhouse:
使用 ClickHouse 数据库的主机名、端口和数据库名称创建一个 foreign server。
这里我们选择使用二进制驱动,它使用 ClickHouse 二进制 协议。你也可以使用 “http” 驱动,它使用 HTTP 接口。 接下来,将 PostgreSQL 用户映射到 ClickHouse 用户。最简单的方法 就是将当前 PostgreSQL 用户映射为该 foreign server 的远程用户:
你也可以指定 password 选项。 现在,添加 taxi 表,只需将远程 ClickHouse 数据库中的所有表导入到一个 Postgres schema 中:
现在,这个表应该已经导入完成了:在 psql 中,使用 \det+ 查看它:
成功!使用 \d 查看所有列:
现在查询该表:
注意这个查询执行得非常快。pg_clickhouse 将整个 查询 (包括 COUNT() 聚合) 下推,因此它会在 ClickHouse 上运行,并且只 向 Postgres 返回一行结果。使用 EXPLAIN 查看:
请注意,“Foreign Scan” 出现在执行计划的根节点,这意味着 整个查询已下推到 ClickHouse。

分析数据

运行一些查询来分析数据。查看以下示例,或自行尝试编写 SQL 查询。
  • 计算平均小费金额:
  • 按乘客人数计算平均费用:
  • 计算每个街区每日的上车次数:
  • 计算每次行程的时长 (以分钟计) ,然后按 行程时长对结果进行分组:
  • 按一天中的小时细分,显示每个街区的上客次数:
  • 将显示时区设为纽约,并检索前往拉瓜迪亚机场或 JFK 机场的行程:

创建字典

在 ClickHouse 服务中创建一个与表关联的字典。该表和字典基于一个 CSV 文件,其中每一行对应纽约市的一个街区。 这些街区会映射到纽约市五个行政区 (Bronx、Brooklyn、Manhattan、Queens 和 Staten Island) 的名称,以及 Newark Airport (EWR)。 下面是所用 CSV file 的一段示例内容,以表格形式展示。文件中的 LocationID 列会映射到 trips 表中的 pickup_nyct2010_giddropoff_nyct2010_gid 列:
  1. 仍在 Postgres 中,使用 clickhouse_raw_query 函数创建一个名为 taxi_zone_dictionary 的 ClickHouse [字典],并通过 S3 中的 CSV file 为该 字典填充数据:
LIFETIME 设为 0 会禁用自动更新,从而避免对我们的 S3 bucket 产生不必要的流量。在其他情况下,你可能需要采用不同的配置。 详情请参见使用 LIFETIME 刷新字典数据
  1. 现在导入它:
  1. 确认可以查询它:
  1. 很好。现在在查询中使用 dictGet 函数来获取某个 行政区的名称。下面这个查询会汇总终点为 LaGuardia 或 JFK 机场的各行政区出租车行程数量:
该查询汇总了终点为 LaGuardia 或 JFK 机场的出租车行程在各 borough 的数量。请注意,其中有相当多的行程 其上车所在街区未知。

执行 join

编写一些查询,将 taxi_zone_dictionary 与你的 trips 表进行连接。
  1. 先从一个简单的 JOIN 开始,它的作用与上面的机场 查询类似:
请注意,上述 JOIN 查询的输出与上面的 dictGet 查询相同 (只是未包含 Unknown 值) 。在底层, ClickHouse 实际上会为 taxi_zone_dictionary 字典调用 dictGet 函数,但 JOIN 语法对 SQL 开发者来说更熟悉。
  1. 此查询会返回小费金额最高的 1000 次行程对应的行, 然后将每一行与该字典进行内连接:
通常,我们会避免在 PostgreSQL 和 ClickHouse 中使用 SELECT *。你 只应检索实际需要的列。
最后修改于 2026年6月19日