dbt-clickhouse 适配器
支持的功能
- 表物化类型
- 视图物化类型
- 增量物化类型
- Microbatch 增量物化类型
- materialized view 物化类型 (使用 MATERIALIZED VIEW 的
TO形式,属 Experimental) - Seeds
- Sources
- 文档生成
- 测试
- Snapshots
- 大多数 dbt-utils macro (现已并入 dbt-core)
- Ephemeral 物化类型
- 分布式表物化类型 (属 Experimental)
- 分布式增量物化类型 (属 Experimental)
- Contracts
- ClickHouse 特有的列配置 (Codec、生存时间 (TTL)…)
- ClickHouse 特有的表设置 (索引、projections…)
--sample 标志,并且已修复所有面向后续版本的弃用警告。dbt 1.10 中引入的Catalog 集成 (例如 Iceberg) 目前尚未在该适配器中获得原生支持,但已有可用的变通方案。详情请参见 Catalog Support 部分。
该适配器暂时还无法在 dbt Cloud 中使用,但我们预计很快会提供支持。如需了解更多信息,请联系支持团队。
dbt 概念和支持的物化类型
dbt-clickhouse 全部支持:
- view (默认) :模型会在数据库中构建为视图。在 ClickHouse 中,这会构建为一个视图。
- table:模型会在数据库中构建为表。在 ClickHouse 中,这会构建为一个表。
- ephemeral:模型不会直接在数据库中构建,而是会作为 CTE (Common Table Expressions,公用表表达式) 被引入依赖它的模型中。
- incremental:模型最初会被物化为表,在后续运行中,dbt 会向表中插入新行并更新发生变化的行。
- materialized view:模型会在数据库中构建为 materialized view。在 ClickHouse 中,这会构建为一个materialized view。
dbt-clickhouse 中的实验性功能:
设置 dbt 和 ClickHouse 适配器
安装 dbt-core 和 dbt-clickhouse
pip 安装 dbt 和 dbt-clickhouse。
为 dbt 提供 ClickHouse 实例的连接信息。
~/.dbt/profiles.yml 文件中配置 clickhouse-service profile,并提供 schema、主机、端口、用户名和密码等属性。完整的连接配置选项列表可参见 功能与配置 页面:
创建 dbt 项目
project_name 目录中,更新 dbt_project.yml 文件,指定用于连接 ClickHouse server 的 profile 名称。
测试连接
dbt debug,确认 dbt 能否连接到 ClickHouse。确认返回结果中包含 Connection test: [OK connection ok],表示连接成功。
前往指南页面,了解如何将 dbt 与 ClickHouse 配合使用的更多信息。
测试和部署你的模型 (CI/CD)
使用简单数据测试和单元测试的 CI/CD
dbt build。
更完整的 CI/CD 阶段:使用最新数据,只测试受影响的模型
- 如果你不需要使用最新数据进行测试,可以将生产数据的备份恢复到暂存环境中。
- 如果你需要使用最新数据进行测试,可以结合使用
remoteSecure()table function 和可刷新materialized view,按所需频率执行 insert。另一种做法是将对象存储作为中间层,定期从生产服务写入数据,再通过对象存储 table function 或 ClickPipes (用于持续摄取) 将其导入暂存环境。
dbt build --select state:modified+ --state path/to/last/deploy/state.json 的命令,根据自上次生产运行以来的变更,有选择地仅重建所需的最少模型。
常见问题排查
连接
- 所用引擎必须是受支持的引擎之一。
- 你必须具备访问数据库的足够权限。
- 如果你使用的不是数据库的默认表引擎,则必须在模型 配置中指定表引擎。
了解长时间运行的操作
debug——这样会输出每个查询的耗时。例如,可以通过在 dbt 命令中附加 --log-level debug 来实现。
限制
- 该插件使用的语法要求 ClickHouse 版本为 25.3 或更高。我们不测试较旧版本的 ClickHouse,目前也不测试 Replicated 表。
- 如果同时运行,不同的
dbt-adapter运行之间可能会发生冲突,因为它们在内部可能会为相同操作使用相同的表名。更多信息,请参见问题 #420。 - 该 适配器 当前使用 INSERT INTO SELECT 将模型 materialize 为表。这实际上意味着如果再次执行运行,会产生重复数据。超大数据集 (PB 级) 可能会导致运行时间极长,从而使某些模型不具备可行性。要提升性能,请通过将视图实现为
materialized: materialization_view来使用 ClickHouse Materialized Views。此外,应尽可能使用GROUP BY,以减少任何查询返回的行数。相比只做转换但保持 source 行数不变的模型,应优先选择对数据进行汇总的模型。 - 要使用 分布式表 来表示模型,必须先在每个节点上手动创建底层 replicated 表,然后再在这些表之上创建 Distributed 表。该 适配器 不管理 cluster 的创建。
- 当 dbt 在 database 中创建 relation (表/视图) 时,通常会按以下形式创建:
{{ database }}.{{ schema }}.{{ table/view id }}。ClickHouse 没有 schema 的概念,因此该 适配器 使用{{schema}}.{{ table/view id }},其中schema就是 ClickHouse database。 - 如果将 ephemeral 模型/CTE 放在 ClickHouse insert 语句的
INSERT INTO之前,它们将无法工作,参见 https://github.com/ClickHouse/ClickHouse/issues/30323。这一般不会影响大多数模型,但在模型定义和其他 SQL 语句中放置 ephemeral 模型时仍需谨慎。
Fivetran
dbt-clickhouse 连接器也可用于 Fivetran transformations,从而能够在 Fivetran 平台内直接使用 dbt 实现无缝集成和转换。