Jinja函数在dbt模型中未逐行执行?结果异常求助
问题解答
这是正常现象,根源在于Jinja 模板的执行时机早于 SQL 语句:
- Jinja 是 dbt 用来生成最终 SQL 的预处理工具,在 dbt 把代码发送给数据库执行之前,所有 Jinja 语法(包括你调用的
{{my_func('id')}})就已经执行完毕,生成固定的结果字符串插入到 SQL 中。 - 你看到的每行相同的
amount值,其实是my_func在预处理阶段只执行一次返回的结果,最终发送给数据库的 SQL 里,amount列就是这个固定值,自然所有行都一样。
如果想要实现类似 SQL 内置函数的逐行计算效果,你需要调整my_func的实现逻辑:
- 不要让它直接返回计算结果,而是让它生成能在数据库中逐行执行的 SQL 表达式。比如如果你的
my_func是要对id做乘2的操作,宏应该返回"t.id * 2"这样的字符串,而不是计算出某个具体数值。 - 或者直接在 SQL 中使用数据库原生的函数,或者把逻辑封装成数据库的自定义函数,这样就能在 SQL 执行阶段逐行处理数据。
举个调整后的例子:
假设你的my_func原本是计算某个值,改成生成SQL表达式的宏:
{% macro my_func(col_name) %} {{ col_name }} * 2 {% endmacro %}
这样在生成的SQL中,amount列会变成t.id * 2,数据库执行时就会逐行计算每个id对应的结果。
内容的提问来源于stack exchange,提问作者mosiki
相关产品推荐
相关产品推荐

