我在dbt包中使用自定义模式名称时遇到问题。
我使用dbt documentation中提供的宏。
{% macro generate_schema_name(custom_schema_name, node) -%}
{%- set default_schema = target.schema -%}
{%- if custom_schema_name is none -%}
{{ default_schema }}
{%- else -%}
{{ default_schema }}_{{ custom_schema_name | trim }}
{%- endif -%}
{%- endmacro %}我把这个宏放在我的dbt包中,这里是dbt package。
最后,我在另一个dbt项目dbt project中使用了这个dbt包。
下面是我的dbt项目中的dbt_project.yml:
name: 'covid_france'
version: '0.0.1'
config-version: 2
profile: 'default'
source-paths: ["models"]
analysis-paths: ["analysis"]
test-paths: ["tests"]
data-paths: ["data"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]
target-path: "target"
clean-targets:
- "target"
- "dbt_modules"我的dbt包中的dbt_project.yml:
name: 'covid_france'
version: '0.0.1'
config-version: 2
profile: 'default'
source-paths: ["models"]
analysis-paths: ["analysis"]
test-paths: ["tests"]
data-paths: ["data"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]
target-path: "target"
clean-targets:
- "target"
- "dbt_modules"
models:
covid_france:
stg:
materialized: table
schema: stg
ods:
materialized: table
process-airbyte-outputs:
schema: ods
unions:
schema: ods
prs:
materialized: view当我尝试运行我的dbt项目时,它导入了dbt包,但没有应用应该从自定义模式名称中删除主模式前缀(在profiles.yml中提供)的宏,例如:我的profiles.yml中提供的模式是"prs“。我还有其他自定义模式,名为ods和stg。但当dbt运行时,它会产生prs、prs_ods和prs_stg。
当我在dbt项目中直接使用宏时,它工作得很好(而不是将它放在dbt项目中使用的dbt包中)。
提前谢谢你!
发布于 2021-07-12 12:07:54
上面写着:
注意: dbt会忽略任何自定义generate_schema_name宏,这些宏是安装在项目中的包的一部分。
因此,绕过这个问题的方法是直接在项目中创建一个小的“填补”或薄包装器,它调用包中的宏。
我认为包项目名称与实际项目名称(两个dbt_project.yml文件的第1行)相同有点令人困惑,所以为了清楚起见,我会给它们起不同的名称。
例如,假设您将包重命名为package_project_name,请使用包中已有的宏代码,但在项目中添加另一个宏,如
{% macro generate_schema_name(custom_schema_name, node) -%}
{{- package_project_name.generate_schema_name(custom_schema_name, node) }}
{%- endmacro %}发布于 2021-02-07 22:54:57
我认为您还需要定义作业的目标,因为宏依赖于目标架构。例如
dbt run --models my_model --target dev在dbt云作业中,您可以定义为
"settings": {"threads": 1,"target_name": "prod"},https://stackoverflow.com/questions/65588257
复制相似问题