dbt 宏 - 使用 *args/**kwargs

Posted

技术标签:

【中文标题】dbt 宏 - 使用 *args/**kwargs【英文标题】:dbt macro - using *args/**kwargs 【发布时间】:2020-10-14 18:26:57 【问题描述】:

有时,我们的表需要将多个列附加在一起以生成唯一键。这可以通过执行以下操作来完成:

select
    *,
    col1 || "_" || col2 as unique_key
from 
    my_table

这可行,但会导致多个分析师之间缺乏一致性。

我想利用 pythons *args(我认为 jinja2 使用 varargs)功能制作一个可以接受任意数量参数并在所有参数之间创建唯一键的宏。

理想的结果:

select
    *,
    unique_key(col1, col1, ..., colN)
from 
    my_table

【问题讨论】:

【参考方案1】:

dbt_utils 包中目前有一个宏可以做类似的事情,称为surrogate key。它过去只使用可变参数,现在也允许使用列表。

对于可变参数部分,它执行以下操作:

%- for field in varargs %
%- set _ = field_list_xf.append(field) -%
%- endfor -%

然后您可以join() 或遍历该列表来做任何您想做的事情。对于宏,它执行以下操作:

%- for field in field_list_xf -%

    %- set _ = fields.append(
        "coalesce(cast(" ~ field ~ " as " ~ dbt_utils.type_string() ~ "), '')"
    ) -%

    %- if not loop.last %
        %- set _ = fields.append("'-'") -%
    %- endif -%

%- endfor -%

【讨论】:

这正是我想要的——我想我错过了set _ = 语法

以上是关于dbt 宏 - 使用 *args/**kwargs的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法覆盖 dbt Cloud CI 运行的模式名称?

dbt post hook 关系“my_table”不存在

python中*args和**kwargs的使用

Python中*args和**kwargs 的简单使用

Python的*args与**kwargs

*args和**kwargs