跳到主要内容
跳到主要内容

集成 dbt 和 ClickHouse

ClickHouse Supported

dbt-clickhouse 适配器

dbt (数据构建工具) 使分析工程师能够通过简单地编写 SELECT 语句来转换他们的数据仓库中的数据。 dbt 处理将这些 SELECT 语句物化为数据库中的对象,形成表和视图 - 执行 提取、加载和转换 (ELT) 中的转换部分。用户可以创建一个由 SELECT 语句定义的模型。

在 dbt 中,这些模型可以相互引用和分层,以允许构建更高级的概念。连接模型所需的样板 SQL 会自动生成。此外,dbt 识别模型之间的依赖关系,并利用有向无环图 (DAG) 确保它们按适当的顺序创建。

dbt 通过一个 ClickHouse 支持的适配器 与 ClickHouse 兼容。我们将通过基于公开可用的 IMDB 数据集的简单示例描述将 ClickHouse 连接的过程。我们还强调当前连接器的一些限制。

支持的特性

支持的特性

  • 表物化
  • 视图物化
  • 增量物化
  • 微批增量物化
  • 物化视图物化 (使用 TO 形式的 MATERIALIZED VIEW,实验性)
  • 种子
  • 文档生成
  • 测试
  • 快照
  • 大多数 dbt-utils 宏 (现已包含在 dbt-core 中)
  • 瞬态物化
  • 分布式表物化 (实验性)
  • 分布式增量物化 (实验性)
  • 合同

概念

dbt 引入了模型的概念。这被定义为一个 SQL 语句,可能会连接多个表。模型可以通过多种方式“物化”。物化代表了模型选择查询的构建策略。物化背后的代码是样板 SQL,它将你的 SELECT 查询封装在一个语句中,以创建或更新现有关系。

dbt 提供 4 种类型的物化:

  • 视图 (默认):模型在数据库中作为视图构建。
  • :模型在数据库中作为表构建。
  • 瞬态:模型不会直接在数据库中构建,而是作为公共表表达式拉入依赖模型中。
  • 增量:模型最初作为表物化,在后续运行中,dbt 将新行插入并更新表中更改的行。

附加的语法和子句定义了如果其基础数据发生变化,这些模型应该如何更新。dbt 通常建议从视图物化开始,直到性能成为问题。表物化通过将模型查询的结果捕获为表,从而提供查询时间的性能提升,但以增加存储为代价。增量方法进一步建立在此基础上,以允许后续更新基础数据捕获在目标表中。

当前的适配器支持 物化视图字典分布式表分布式增量 物化。适配器还支持 dbt快照种子

关于支持的物化的详细信息

类型支持?详细信息
视图物化创建一个 视图
表物化创建一个 。请参阅下面支持的引擎列表。
增量物化创建一个表(如果它不存在),然后仅向其中写入更新。
瞬态物化创建一个瞬态/CTE 物化。该模型在 dbt 内部,不会创建任何数据库对象。

以下是 ClickHouse 中的 实验性特性 :

类型支持?详细信息
物化视图物化是,实验性创建一个 物化视图
分布式表物化是,实验性创建一个 分布式表
分布式增量物化是,实验性基于与分布式表相同思想的增量模型。请注意,并不是所有策略都受支持,访问 此处 以获取更多信息。
字典物化是,实验性创建一个 字典

dbt 和 ClickHouse 适配器的设置

安装 dbt-core 和 dbt-clickhouse

pip install dbt-clickhouse

提供 dbt 与我们的 ClickHouse 实例的连接详细信息。

~/.dbt/profiles.yml 文件中配置 clickhouse 配置文件,并提供用户、密码、模式主机属性。连接配置选项的完整列表可在 功能和配置 页面中查找:

clickhouse:
  target: dev
  outputs:
    dev:
      type: clickhouse
      schema: <target_schema>
      host: <host>
      port: 8443 # use 9440 for native
      user: default
      password: <password>
      secure: True

创建 dbt 项目

dbt init project_name

project_name 目录中,更新你的 dbt_project.yml 文件以指定一个配置文件名称,以连接到 ClickHouse 服务器。

profile: 'clickhouse'

测试连接

使用 CLI 工具执行 dbt debug 以确认 dbt 是否能够连接到 ClickHouse。确认响应包括 Connection test: [OK connection ok],表示连接成功。

我们假设以下示例使用 dbt CLI。此适配器仍然不可用于 dbt Cloud 内部使用,但我们预计很快就会提供。请联系支持以获取更多信息。

dbt 提供了许多 CLI 安装选项。按照 这里 的说明进行操作。此时仅安装 dbt-core。我们建议使用 pip 安装 dbt 和 dbt-clickhouse。

pip install dbt-clickhouse

访问 指南页面,了解有关如何将 dbt 与 ClickHouse 一起使用的更多信息。

连接故障排除

如果您在从 dbt 连接到 ClickHouse 时遇到问题,请确保满足以下标准:

  • 引擎必须是 支持的引擎 之一。
  • 您必须具有足够的权限访问数据库。
  • 如果您没有使用数据库的默认表引擎,则必须在模型配置中指定一个表引擎。

限制

当前的 ClickHouse 适配器对 dbt 有几个限制,用户应注意:

  1. 适配器目前使用 INSERT TO SELECT 将模型物化为表。这实际上意味着数据重复。非常大的数据集 (PB) 可能导致运行时间极长,使某些模型不可行。尽量减少任何查询返回的行数,尽可能利用 GROUP BY。倾向于总结数据的模型,而不是简单执行转换,同时保持源的数据行数。
  2. 要使用分布式表表示模型,用户必须手动在每个节点上创建基础的复制表。分布式表可以在这些基础上创建。适配器不管理集群创建。
  3. 当 dbt 在数据库中创建关系(表/视图)时,它通常创建为:{{ database }}.{{ schema }}.{{ table/view id }}。ClickHouse 没有模式的概念。因此,适配器使用 {{schema}}.{{ table/view id }},其中 schema 是 ClickHouse 数据库。
  4. 瞬态模型/CTE 在 ClickHouse 插入语句中的 INSERT INTO 之前放置时不起作用,详见 https://github.com/ClickHouse/ClickHouse/issues/30323。这不应影响大多数模型,但在模型定义和其他 SQL 语句中放置瞬态模型时应谨慎。

进一步信息

之前的指南仅触及了 dbt 功能的表面。建议用户阅读优秀的 dbt 文档

有关适配器的其他配置,请参见 这里

Fivetran

dbt-clickhouse 连接器也可用于 Fivetran 转换,允许在 Fivetran 平台中直接使用 dbt 进行无缝集成和转换功能。