【问题标题】:dbt macro - using *args/**kwargsdbt 宏 - 使用 *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

【问题讨论】:

    标签: sql jinja2 snowflake-cloud-data-platform dbt


    【解决方案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 _ = 语法
    猜你喜欢
    • 2012-12-06
    • 2017-03-26
    • 2018-10-18
    • 2023-04-01
    • 2013-08-04
    • 2020-09-16
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多