我在 DBT 中有一个用例,我需要根据文件夹结构设置模式名称,因为有很多文件夹和很多模型。我已经在 DBT_project.yml 文件中完成了该文件夹级别,并且工作正常。但我想让它更通用一些,并将值分配给变量,然后使用该变量来填充架构名称。
由于 DBT 不支持引用 DBT_project.yml 中定义的变量,因此我无法使用特定于文件夹的变量分配架构。除了 DBT_project.yml 之外,DBT 不支持在资源/文件夹级别进行配置。
对此有什么建议吗?有没有办法在 DBT_project.yml 之外定义变量并在 YML 文件中使用它或配置除 DBT_project.yml 之外的资源/文件夹级别。
我尝试在模型级别和文件夹级别配置架构,效果很好。但是在project.yml中定义变量然后使用is作为文件夹级别是行不通的。
与https://stackoverflow.com/questions/75698936/how-to-reference-variables-defined-in-dbt-project-yml
同样的问题您可以通过自定义 dbt 生成模式名称的方式来解决该问题。为此,您需要将
generate_schema_name.sql
宏放入宏文件夹中(请参阅详细信息此处)。
在那里,您可以做两件事:
fqn
方法访问模型的完整路径。 fqn 包含路径值列表:[project, sub_folder, sub_sub_folder, ..., model_name]
。详情请看这里dbt_project.yml
dbt_project.yml
:
vars:
schema_names: {"folder_1": "schema_1", "folder_2": "schema_2"}
macros/generate_schema_name.sql
:
{% macro generate_schema_name(custom_schema_name, node) -%}
{%- set default_schema = target.schema -%}
{%- if node.fqn|length > 2 -%}
{{ default_schema }}_{{ var("schema_names")[node.fqn[1]] | trim }}
{%- else -%}
{{ default_schema }}
{%- endif -%}
{%- endmacro %}