多Schema场景下dbt Source引用冲突问题及解决方案咨询
问题分析与解决办法
根因说明
你的sources.yaml配置存在语法错误:在同一个staging源下重复定义了schema字段。YAML不允许同一映射内存在重复键,第二个schema: finance会直接覆盖第一个schema: sales,导致整个staging源指向finance schema,而table_a实际在sales schema中,因此dbt找不到该表。
正确配置方案
要解决不同schema下的表引用问题,需要为每个schema单独定义一个源条目,这是符合dbt设计规范的做法:
修正后的sources.yaml
version: 2 sources: - name: staging_sales database: staging schema: sales tables: - name: table_a - name: staging_finance database: staging schema: finance tables: - name: table_b
对应调整模型文件
如果你想保留environment变量的使用,可以通过变量拼接来引用不同源:
#my_cool_model.sql SELECT a.ID, b.DATE FROM {{ source(var('environment') ~ '_sales', 'table_a') }} a INNER JOIN {{ source(var('environment') ~ '_finance', 'table_b') }} b
注:原模型中第二个source调用存在语法错误(多了一个左括号),已在上述代码中修正。
补充说明
这并非dbt的功能限制,而是YAML语法和dbt源定义规则的要求。每个dbt源只能关联一个schema,不同schema的表必须拆分到不同的源条目里。这种方式也更清晰,便于后续维护和权限管理。
内容的提问来源于stack exchange,提问作者Umar.H
相关产品推荐
相关产品推荐

