Profile.yml 配置
profiles.yml 文件中添加一个 profile。ClickHouse 的 profile 需符合以下语法:
schema 与 database
database.schema.table 与 ClickHouse 不兼容,因为 ClickHouse 不支持 schema。
因此,我们采用简化形式 schema.table,其中 schema 表示 ClickHouse 的 database。不建议使用 default database。
SET 语句警告
设置 quote_columns
dbt_project.yml 中为 quote_columns 显式指定一个值。更多信息请参阅 quote_columns 文档。
关于 ClickHouse 集群
- 设置
cluster参数。 - 确保写后读一致性,尤其是在使用多个
threads时。
集群设置
cluster 设置可让 dbt-clickhouse 针对 ClickHouse 集群运行。如果在 profile 中设置了 cluster,默认情况下,所有模型都会使用 ON CLUSTER 子句创建——使用 Replicated 引擎的模型除外。这包括:
- 创建数据库
- 视图物化类型
- 表和增量物化类型
- 分布式物化类型
ON CLUSTER 子句,因为它们旨在自行管理复制。
如果想让某个特定模型不使用基于集群的创建方式,请添加 disable_on_cluster 配置:
cluster 设置的影响 (模型只会
在当前连接的节点上创建) 。
兼容性
如果某个模型在创建时未设置 cluster,dbt-clickhouse 会检测到这种情况,并在该模型上执行所有不带 on cluster 子句的 DDL/DML。
写后读一致性
- 如果你使用的是 ClickHouse Cloud 集群,只需在 profile 的
custom_settings属性中设置select_sequential_consistency: 1。有关此设置的更多信息,请参见这里。 - 如果你使用的是自托管集群,请确保所有 dbt 请求都发送到同一个 ClickHouse 副本。如果上层有负载均衡器,请尝试使用某种
replica aware routing/sticky sessions机制,以确保始终访问同一个副本。在 ClickHouse Cloud 之外的集群中添加设置select_sequential_consistency = 1不推荐。
其他 ClickHouse 宏
模型物化实用宏
engine_clause— 使用engine模型配置属性来指定 ClickHouse 表引擎。dbt-clickhouse 默认使用MergeTree引擎。partition_cols— 使用partition_by模型配置属性来指定 ClickHouse 分区键。默认不指定 分区键。order_cols— 使用order_by模型配置来指定 ClickHouse 的 ORDER BY/排序键。如果未指定, ClickHouse 将使用空的 tuple(),并且该表将处于未排序状态primary_key_clause— 使用primary_key模型配置属性来指定 ClickHouse 主键。默认情况下, 会设置主键,ClickHouse 将使用 ORDER BY 子句作为主键。on_cluster_clause— 使用clusterprofile 属性为某些 dbt 操作添加ON CLUSTER子句: Distributed 物化、视图创建和数据库创建。ttl_config— 使用ttl模型配置属性来指定 ClickHouse 表生存时间 (TTL) 表达式。默认不指定 TTL。
s3Source 辅助宏
s3source 宏简化了通过 ClickHouse S3 表函数直接从 S3 选择 ClickHouse 数据的过程。它的工作原理是,
从一个具名配置字典中填充 S3 表函数的参数 (该字典名称必须以
s3 结尾) 。该宏
会先在 profile 的 vars 中查找该字典,然后再在模型配置中查找。该字典可以包含以下任意
键,用于填充 S3 表函数的
参数:
有关如何使用此宏的示例,请参见
S3 测试文件。
跨数据库宏支持
dbt Core 中包含的大多数跨数据库宏,但以下情况除外:
- ClickHouse 中的
split_partSQL 函数是通过 splitByChar 函数实现的。该函数要求 “split”分隔符必须使用常量字符串,因此此宏使用的delimeter参数会被 解释为字符串,而不是列名 - 同样,ClickHouse 中的
replaceSQL 函数要求old_chars和new_chars参数必须是常量字符串,因此调用此宏时,这些参数会被解释为字符串而不是列名。
目录支持
dbt 目录集成状态
ClickHouse 目录支持
experimental 阶段,但如果你使用的是较新的 ClickHouse 版本,已经可以使用这些功能。
- 你可以使用 ClickHouse,通过 Iceberg 表引擎 和 Iceberg 表函数 查询存储在对象存储中 (S3、Azure Blob 存储、Google Cloud Storage) 的 Iceberg 表。
- 此外,ClickHouse 还提供了 DataLakeCatalog 数据库引擎,可连接到外部数据目录,包括 AWS Glue Catalog、Databricks Unity Catalog、Hive Metastore 和 REST Catalog。这样,你就可以直接从外部目录查询开放表格式的数据 (Iceberg、Delta Lake) ,而无需复制数据。
使用 Iceberg 和目录的变通方案
source 功能,在 dbt 项目中引用这些表。比如,如果你想访问 REST 目录中的表,可以:
- 创建一个指向外部目录的数据库:
- 在 dbt 中将目录数据库及其表定义为 source: 请注意,这些表应已在 ClickHouse 中可用
- 在 dbt 模型中使用目录中的表:
关于这些变通方案的说明
- 你可以立即使用不同类型的外部表和外部目录,无需等待原生 dbt 目录集成。
- 原生目录支持可用后,你也能顺畅迁移过去。
- **手动设置:**在 dbt 中引用 Iceberg 表和目录数据库之前,必须先在 ClickHouse 中手动创建它们。
- **不支持目录级 DDL:**dbt 无法管理目录级操作,例如在外部目录中创建或删除 Iceberg 表。因此,目前你还无法通过 dbt connector 创建这些表。未来可能会增加通过 Iceberg() 引擎创建表的能力。
- **写入操作:**目前,向 Iceberg/Data Catalog 表写入的能力仍然有限。请查阅 ClickHouse 文档,了解当前可用的选项。