自定义模式名称的宏不适用于 dbt 包
Posted
技术标签:
【中文标题】自定义模式名称的宏不适用于 dbt 包【英文标题】:Macro for custom schema names doesn't apply in a dbt package 【发布时间】:2021-01-05 23:54:32 【问题描述】:我在 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 包中),该宏过去可以正常工作
提前谢谢你!
【问题讨论】:
欢迎来到 SO。请澄清问题并添加更多详细信息,特别是您认为超出预期范围的代码部分。仅仅发布链接是不够的。谢谢。 我希望它足够清楚。不要犹豫,告诉我你想让我添加什么。谢谢。 【参考方案1】:在文档中:https://docs.getdbt.com/docs/building-a-dbt-project/building-models/using-custom-schemas#changing-the-way-dbt-generates-a-schema-name
上面写着:
注意:dbt 会忽略任何自定义的 generate_schema_name 宏,它们是您项目中安装的包的一部分。
因此,解决此问题的方法是直接在您的项目中创建一个小的“shim”或薄包装器,以调用您包中的宏。
我认为您的包项目名称与您的实际项目名称(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 %
【讨论】:
【参考方案2】:我相信您还需要定义作业的目标,因为宏取决于目标架构。 例如
dbt run --models my_model --target dev
在 dbt 云作业中,可以定义为
"settings": "threads": 1,"target_name": "prod",
【讨论】:
以上是关于自定义模式名称的宏不适用于 dbt 包的主要内容,如果未能解决你的问题,请参考以下文章
CountVectorizer fit-transform() 不适用于自定义 token_pattern