将数据写入开放表格式
在前面的指南中,你已经直接查询了开放表格式中的数据,并将数据加载到 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 源表相比,表结构必须更简化。ClickHouse 支持比 Iceberg 及其底层 Parquet 文件更丰富的类型系统——例如 Enum、LowCardinality 和 UInt8 等类型在 Iceberg 中不受支持,必须映射为兼容的类型。
插入部分数据
使用 INSERT INTO SELECT 将数据从 MergeTree 表写入 Iceberg 表。在此示例中,我们仅写入伦敦的交易数据:
查询 Iceberg 表
现在,数据已以 Iceberg 格式存储在对象存储中,并且可以通过 ClickHouse 或任何其他支持读取 Iceberg 的工具进行查询:
写入聚合结果
Iceberg 表并不局限于存储原始行数据。它们还可以保存聚合和转换的输出,也就是在 ClickHouse 内部执行的 ETL 过程所产生的结果。这对于将预先计算好的汇总结果发布到 lakehouse 供下游使用非常有帮助。
为聚合结果创建 Iceberg 表
插入聚合后的数据
按城镇计算房产平均价格,并将结果直接写入 Iceberg:
查询聚合表
现在,其他工具和其他 ClickHouse 实例也可以读取这个预计算的数据集: