向开放表格式写入数据
在前面的指南中,你在原始位置就地查询开放表格式的数据,并将其加载到 MergeTree 中以实现快速分析。在许多架构中,数据还需要沿相反方向流动——从 ClickHouse 回写到湖仓格式。通常出于以下两种场景的需求:
- 卸载到长期存储 - 数据首先进入 ClickHouse,作为实时分析层,为仪表盘和运维报表提供支持。当数据超出其实时分析窗口后,可以将其写出到对象存储中的 Iceberg,以一种持久、具备成本效益且可互操作的格式进行保留。
- Reverse ETL - 在 ClickHouse 内执行的转换、聚合和增强(enrichment)操作会生成派生数据集,下游工具和其他团队需要消费这些数据。将这些结果写入 Iceberg 表,可以让它们在更广泛的数据生态系统中可用。
在这两种情况下,INSERT INTO SELECT 都可以用于将数据从 ClickHouse 表移动到存储在对象存储中的 Iceberg 表中。
当前对开放表格式的写入仅支持 Iceberg 表。对 Delta Lake 表的部分支持正在开发中。这些表不能由 catalog 管理。
准备源数据集
在本指南中,我们将使用 UK Price Paid 数据集——一份涵盖英格兰和威尔士所有住宅房产交易的公开记录。
创建并写入 MergeTree 表
直接从公共 CSV 数据源向该表写入数据:
将数据写入 Iceberg 表
创建 Iceberg 表
要将数据写入 Iceberg,请使用 IcebergS3 表引擎创建一个表。
请注意,与 MergeTree 源表相比,Iceberg 表的模式必须进行简化。ClickHouse 支持比 Iceberg 和其底层 Parquet 文件更丰富的类型系统——诸如 Enum、LowCardinality 和 UInt8 等类型在 Iceberg 中不受支持,必须映射为兼容类型。
插入数据子集
使用 INSERT INTO SELECT 将 MergeTree 表中的数据写入 Iceberg 表。在此示例中,我们仅写入伦敦的交易记录:
查询 Iceberg 表
数据现在作为 Iceberg 存储在对象存储中,可以通过 ClickHouse(或任何其他可读取 Iceberg 的工具)进行查询:
写入聚合结果
Iceberg 表不仅限于存储原始行。它们还可以保存聚合与转换的输出——即在 ClickHouse 内执行的 ETL 流程结果。这对于将预计算的汇总结果发布到数据湖仓以供下游消费非常有用。
为聚合数据创建 Iceberg 表
插入聚合数据
按城镇计算平均房价,并将结果直接写入 Iceberg 表中:
查询聚合表
其他工具以及其他 ClickHouse 实例现在都可以读取这个预先计算的数据集: