跳转到主要内容
在前面的指南中,您已经就地查询了开放表格式,并将数据加载到 MergeTree 中进行快速分析。在许多架构中,数据也需要向相反方向流动——从 ClickHouse 回写到开放表格式。这通常由以下两种常见场景驱动:
  • 卸载到长期存储 - 数据进入 ClickHouse 后,作为实时分析层为仪表盘和运营报表提供支持。一旦数据超出实时分析窗口,就可以将其写入对象存储中的 Iceberg,以互操作格式实现持久、低成本的长期保留。
  • 反向 ETL - 在 ClickHouse 内执行的转换、聚合和富集会生成派生数据集,供下游工具和其他团队使用。将这些结果写入 Iceberg 表后,它们就能在更广泛的数据生态系统中使用。
在这两种情况下,INSERT INTO SELECT 都可以让您将数据从 ClickHouse 表移动到存储在对象存储中的 Iceberg 表。
目前,写入开放表格式仅支持 Iceberg 表。对 Delta Lake 表的部分支持仍在开发中。表不能由 catalog 管理。

准备源数据集

本指南将使用 UK Price Paid 数据集——这是一份记录英格兰和威尔士所有住宅房产交易的公开数据集。

创建并向 MergeTree 表写入数据

直接从公开的 CSV 数据源将数据导入该表:

向 Iceberg 表写入数据

创建 Iceberg 表

要将数据写入 Iceberg,请使用 IcebergS3 表引擎创建表。 请注意,与 MergeTree 源表相比,schema 必须适当简化。ClickHouse 支持的类型系统比 Iceberg 及其底层 Parquet 文件更丰富,因此 EnumLowCardinalityUInt8 等类型在 Iceberg 中不受支持,必须映射为兼容类型。

插入部分数据

使用 INSERT INTO SELECT 将数据从 MergeTree 表写入 Iceberg 表。在此示例中,我们只写入伦敦的事务:

查询 Iceberg 表

现在,数据已以 Iceberg 格式存储在对象存储中,可通过 ClickHouse 或任何其他支持读取 Iceberg 的工具进行查询:

写入聚合结果

Iceberg 表不仅可用于存储原始行,还可以保存聚合和转换的输出,即在 ClickHouse 内部执行的 ETL 流程所得结果。这对于将预计算的汇总发布到湖仓以供下游消费非常有用。

创建用于存储聚合结果的 Iceberg 表

插入聚合数据

按城镇计算平均房价,并将结果直接写入 Iceberg:

查询聚合表

现在,其他工具和其他 ClickHouse 实例都可以读取这份预先聚合好的数据:
最后修改于 2026年6月29日