DBT宏在我的DBT模型中没有返回任何内容



我创建了一个宏,从full_name中提取last_name并返回last_name

{% macro parse_last_name(column_name) %}
{% if column_name is none %}
{{ return (column_name) }}
{% else %}
{{ return (column_name.split(',')[1]) }}
{%endif%}
{% endmacro %}

这在我的dbt型号中被称为


select 

{{parse_last_name('FULL_NAME')}} AS LAST_NAME
from <table_schema>

但是编译的SQL是:

select 

AS LAST_NAME
from <target_schema>

所以我的宏没有返回任何内容。

我正在使用dbt run --select model_name.sql运行我的模型

我在这里做错了什么?

宏有两个问题:

  1. 您不希望使用return关键字。return在jinja上下文中将数据传递回调用者,但实际上您正试图在这里编写SQL代码
  2. 数据不会在jinja上下文中流动。当您编写column_name.split(',')[1]时,您实际上是在拆分作为字符串传入的列的NAME,而不是该列的数据。换句话说,您的宏相当于"LAST_NAME".split(",")[1]

您需要宏返回SQL来为您进行此解析。像这样的东西可以(在Snowflake上(:

{% macro parse_last_name(column_name) %}
split_part({{ column_name }}, ',', 2)
{% endmacro %}

请注意,这使用了SQL函数split_part,因此在编译模型时,它将变为有效的SQL:

select 

split_part(LAST_NAME, ',', 2) AS LAST_NAME
from <target_schema>

最新更新