postgresql 同一DBT项目中的多个数据集(源)

j0pj023g  于 2023-01-13  发布在  PostgreSQL
关注(0)|答案(1)|浏览(182)

我刚接触DBT,正面临着一个设计挑战。问题是我有20多个数据集成。每个集成都将数据输入一个Postgres DB。Postgres DB有几个表,例如integration_1_assetsintegration_2_assets。这些表都用于资产,但具有不同的数据集(不同的列名等)。
现在,我想创建一个DBT项目,为每个集成选择数据,然后将这些数据转换为一个最终的dim_assets表。在最终插入到dim_assets之前,它们可能是一个或多个数据转换。业务要求我们以不同的方式为每个集成运行转换,即integration_1应具有独立于其他集成的转换管道。
我应该为每个集成管道创建一个DBT项目,还是可以使用一个?

gab6jxml

gab6jxml1#

如果您有一个包含许多表的postgres数据库(每个集成一个表),那么我认为您应该有一个DBT项目。
这些文档描述了如何在profiles.yml中设置postgres连接
您可能需要如下配置一些信号源(我们将其命名为sources.yml):

version: 2

sources:

  - name: assets
    description: "Tables containing assets from various integrations"
    database: your_database
    schema: your_schema
    tables:
      - name: integration_1
        identifier: integration_1_assets
        description: "Assets from integration 1"
      - name: integration_2
...

best practices for project structure之后,我建议您创建一组“暂存”模型,直接从源模型读取并执行基本的清理/转换:

-- stg_assets_1.sql

    SELECT
        col1 AS standard_column_name_1,
        ...
        colN AS standard_column_name_N
      FROM
        {{ source('assets', 'integration_1') }}
     WHERE
        data_is_good = true

...然后通过一系列中间步骤,将多个暂存模型组合成单个dim_assets模型。
项目布局将如下所示

models
├── sources
│   └── sources.yml
├── staging
│   ├── stg_models.yml
│   ├── stg_assets_1.sql
...
│   └── stg_assets_N.sql
├── intermediate
│   ├── int_models.yml
│   ├── int_assets_combined_1.sql
...
│   └── int_assets_combined_M.sql
└── final
    ├── final_models.yml
    └── dim_assets.sql

这里的中间/最终模型(或者你喜欢怎么称呼它们)将引用早期的模型,使用{{ ref('stg_assets_1') }}等等。
其他YAML文件是模型文件,允许您记录(和测试)每个子目录中定义的模型。
诸如物化策略之类的东西可以在顶层dbt_project.yml中定义(例如,中间模型可以是短暂的或视图,而最终的dim_assets模型可以物化为表)。

相关问题