安装带有 ClickHouse 依赖的 dlt
安装包含 ClickHouse 依赖的 dlt 库:
设置指南
1
初始化 dlt 项目
首先,按如下方式初始化一个新的dlt 项目:此命令会将你的管道初始化为以 chess 作为数据源、以 ClickHouse 作为目标端。
.dlt/secrets.toml 以及 ClickHouse 的 requirements 文件。你可以按如下方式执行 requirements 文件中指定的必要依赖安装:pip install dlt[clickhouse],这会安装 dlt 库以及将 ClickHouse 用作目标端所需的必要依赖。2
设置 ClickHouse 数据库
要将数据加载到 ClickHouse 中,你需要创建一个 ClickHouse 数据库。下面是大致步骤:- 你可以使用现有的 ClickHouse 数据库,也可以新建一个。
-
要创建新数据库,请使用
clickhouse-client命令行工具或你选择的 SQL 客户端连接到 ClickHouse 服务器。 - 运行以下 SQL 命令来创建新数据库、用户并授予必要权限:
3
添加凭据
接下来,按如下所示在.dlt/secrets.toml 文件中设置 ClickHouse 凭据:HTTP_PORT
http_port 参数用于指定连接到 ClickHouse 服务器 HTTP 接口时使用的端口号。这与默认端口 9000 不同,后者用于原生 TCP 协议。如果你不使用外部暂存 (即未在管道中设置 staging 参数) ,则必须设置 http_port。这是因为内置的 ClickHouse 本地存储暂存使用 clickhouse content 库,而该库通过 HTTP 与 ClickHouse 通信。请确保你的 ClickHouse 服务器已配置为接受 http_port 指定端口上的 HTTP 连接。例如,如果你设置 http_port = 8443,那么 ClickHouse 应在 8443 端口监听 HTTP 请求。如果你使用外部暂存,则可以省略 http_port 参数,因为这种情况下不会使用 clickhouse-connect。clickhouse-driver 库所使用的数据库连接字符串。上述凭据如下所示:写入策略
merge 策略,你需要为资源指定 primary_key。你可以在这里了解更多。
Append:这是默认策略。它会将数据追加到目标端中现有的数据后面,并忽略 primary_key 字段。
数据加载
- 对于本地文件,使用
clickhouse-connect库通过INSERT命令将文件直接导入 ClickHouse 表中。 - 对于存放在远程存储中的文件,例如
S3、Google Cloud Storage或Azure Blob 存储,则使用 ClickHouse 表函数 (如 s3、gcs 和 azureBlobStorage) 读取文件,并将数据插入表中。
数据集
ClickHouse 不支持在同一个数据库中使用多个数据集,而 dlt 出于多种原因依赖数据集。为了让 ClickHouse 能与 dlt 一起工作,dlt 在你的 ClickHouse 数据库中生成的表会以数据集名称为前缀,并用可配置的 dataset_table_separator 分隔。此外,还会创建一个不包含任何数据的特殊哨兵表,使 dlt 能识别 ClickHouse 目标端中哪些虚拟数据集已经存在。
支持的文件格式
clickhouse 目标端与默认的 SQL 目标端相比有一些特定差异:
ClickHouse提供 Experimental 的object数据类型,但我们发现其行为有些不稳定,因此 dlt 的 clickhouse 目标端会将复杂数据类型加载到文本列中。如果你需要此功能,请在我们的 Slack 社区联系我们,我们会考虑添加。ClickHouse不支持time数据类型。time会被加载到text列中。ClickHouse不支持binary数据类型。二进制数据会改为加载到text列中。从jsonl加载时,二进制数据将是 base64 字符串;从 parquet 加载时,binary对象会被转换为text。ClickHouse允许向已有数据的表中添加非 NULL 列。ClickHouse在使用 float 或 double 数据类型时,在某些情况下可能会产生舍入误差。如果你不能接受舍入误差,请务必使用 decimal 数据类型。例如,当加载器文件格式设置为jsonl时,将值 12.7001 加载到 double 列中会稳定地产生舍入误差。
支持的列提示
primary_key- 将该列标记为主键的组成部分。多个列都可以使用此提示来创建复合主键。
表引擎
ReplicatedMergeTree 表引擎创建。你可以通过 clickhouse 适配器中的 table_engine_type 指定其他表引擎:
merge_tree- 使用MergeTree引擎创建表replicated_merge_tree(默认) - 使用ReplicatedMergeTree引擎创建表
暂存支持
dlt 会将 Parquet 或 jsonl 文件上传到暂存位置,并使用 ClickHouse 表函数直接从暂存文件中加载数据。
请参阅 filesystem 文档,了解如何为这些暂存目标配置凭证:
要运行启用暂存的管道:
使用 Google Cloud Storage 作为暂存区
- 按照 Google Cloud 指南为你的 GCS 服务账号创建 HMAC 密钥。
-
在
config.toml中,将 HMAC 密钥以及服务账号的client_email、project_id和private_key配置到 dlt 项目的 ClickHouse 目标端设置中:
bashgcp_access_key_id 和 gcp_secret_access_key 之外,您现在还需要在 [destination.filesystem.credentials] 下为您的服务账号提供 client_email、project_id 和 private_key。这是因为当前的 GCS 暂存支持只是作为临时变通方案实现的,且尚未优化。
dlt 会将这些凭据传递给 ClickHouse,由其负责处理身份验证和 GCS 访问。
目前正在积极推进相关工作,以便未来简化并改进 ClickHouse dlt 目标端的 GCS 暂存配置。正式的 GCS 暂存支持正在以下 GitHub issue 中跟踪: