如何覆盖我的 dbt 包中将由其他项目使用的全局 DBT 宏

san*_*t08 5 python apache-spark dbt

我有一个名为 的 DBT 包dbt_helpers,我打算在其中覆盖内置全局宏中的一些 dbt。在此示例中,我打算重写该宏dbt_spark_validate_get_file_format,该宏存在于此处的dbt Spark 适配器中。

我已参考此处指定的 dbt 文档来实现我的用例。以下是我在包文件夹下的包中实现宏的方法macros

{% macro dbt_spark_validate_get_file_format(raw_file_format) -%}
    {{ return(adapter.dispatch('dbt_spark_validate_get_file_format','dbt_helpers')(raw_file_format)) }}
{%- endmacro %}


{% macro default__dbt_spark_validate_get_file_format(raw_file_format) %}
    {% do log('overriding global macro', info=true) %}
    {#  Custom implementation here  #}
    
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

我使用了dbt_helpers与我的包名称相同的宏命名空间。我已在我的主 DBT 项目中将其指定为 中的包,并且在运行命令后packages.yml我能够看到目录中定义的宏。在我的主 dbt 项目中,我已包含项目级别调度配置,以从我的包中获取宏,如图所示,如dbt 文档的本节中所述。dbt_packagesdbt depsdbt_project.yml

dispatch:
  - macro_namespace: dbt
    search_order: ['dbt_helpers','dbt']
Run Code Online (Sandbox Code Playgroud)

但是,当我运行 dbt 模型时,包中定义的宏不会被调用,而是仍在调用内置的全局宏。我可以通过将宏直接放置在我的项目宏文件夹中来覆盖宏,但我需要从我的dbt_helpers包中覆盖宏。我怎样才能做到这一点?

Jos*_* D. 2

我在 Spark 适配器中看不到名为 contains the string 的宏validate_get_file_format

如果您能够识别要覆盖的宏的确切名称,则可以创建一个具有相同名称的宏并将其放入包中,而无需担心调度配置。仅当您尝试从另一个(而不是宏)覆盖时,您才需要担心这一点。

我相信这个优先级适用于所有宏而不仅仅是具体化。