【问题标题】:How to override global DBT macros in my dbt package that will be used by other projects如何覆盖我的 dbt 包中将被其他项目使用的全局 DBT 宏
【发布时间】:2023-02-24 08:24:00
【问题描述】:

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

我参考了指定here 的 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 %}

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

dispatch:
  - macro_namespace: dbt
    search_order: ['dbt_helpers','dbt']

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

【问题讨论】:

    标签: python apache-spark dbt


    【解决方案1】:

    我在名为 validate_get_file_format 的 spark 适配器中看不到宏。

    如果您能够识别精确的您要覆盖的宏的名称,您可以只创建一个具有相同名称的宏并将其放入您的包中,而无需担心调度配置。如果你试图从另一个覆盖,你只需要担心这个包裹,不是宏。

    我相信 this precedence 适用于所有宏,而不仅仅是具体化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 2022-01-11
      • 2021-02-17
      • 2021-10-19
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多