如何通过dbt设置Postgres Citus表使用列式存储
dbt对接Citus压缩及列式存储功能实现方案
首先请确保你的dbt环境已经安装官方维护的dbt-citus适配器,无需额外修改基础连接逻辑即可适配Citus的多数核心特性。
列式存储功能实现
Citus的列式存储基于PostgreSQL内置的columnar访问方法实现,dbt侧有两种常用实现方案:
- 单表快速配置:通过模型的
post_hook参数在表创建完成后自动切换存储引擎,适合少量表需要列存的场景,示例配置如下:{{ config( materialized = 'table', post_hook = [ "ALTER TABLE {{ this }} SET ACCESS METHOD columnar;" ] ) }} -- 以下是你的业务模型逻辑 select col1, col2, create_time from your_source_table - 批量场景自定义材料化模板:如果有大量表需要统一用列存,可在项目
macros目录下自定义列存表的材料化宏,直接在建表语句中指定ACCESS METHOD columnar,后续对应模型只需在config中指定materialized = 'columnar_table'即可,无需重复编写hook。
数据压缩功能实现
Citus的压缩能力分为行存表压缩和列存表压缩两类,均可通过dbt配置实现:
- 行存表压缩:适用于不需要列存的维度表等场景,可开启PostgreSQL自带的zstd高压缩算法,示例post_hook配置:
post_hook = ["ALTER TABLE {{ this }} SET (compression = 'zstd', toast.compression = 'zstd');"] - 列存表压缩:列存默认自带压缩能力,可自定义压缩算法和级别(级别范围1-19,压缩比越高写入耗时越长),示例post_hook配置:
如果你使用自定义列存材料化模板,可直接将上述参数写入建表语句的WITH子句中,无需重复配置hook。post_hook = ["ALTER TABLE {{ this }} SET (columnar.compression = 'zstd', columnar.compression_level = 9);"]
额外适配注意事项
- 若需要使用Citus的分片能力,只需在模型config中添加
distribution_column参数即可自动完成分片配置,示例:config(distribution_column = 'user_id'),无需手动编写分片DDL。 - 增量模型的存储、压缩、分片配置仅在首次建表时执行,后续增量写入不会修改已有配置,无需额外兼容处理。
内容的提问来源于stack exchange,提问作者MYK
相关产品推荐
相关产品推荐

