使用 dbt 中的星形宏获取列名和类型

使用星形宏,除了列名之外,还有没有办法获取列数据类型(布尔值、数字等)?

例如,该查询使用星形宏从引用表中收集列名,将其保存为数组变量 column_names ,然后循环该数组并将 max 函数应用于所有列。

{% set column_names = star(
    from=ref_table,
    except=["a", "b", "c"],
    as_list=True)
%}

select 
    date_trunc('week', day) as week,
    name,

    {%- for col in column_names %}  
    max({{ col|lower }}) as {{ col | lower }}{%- if not loop.last %},{{ 'n  ' }}{% endif %}
    {%- endfor %}

from {{ ref('my_table_name') }}    
group by 1, 2

我想有条件地将 max 函数仅应用于布尔列。

这可能看起来像

{%- for col in column_names %}  
    {% if is_boolean(col) %}  
    max({{ col|lower }}) as {{ col | lower }}{%- if not loop.last %},{{ 'n  ' }}{% endif %}
    {% endif %}
{%- endfor %}

但问题是星宏将列名作为字符串传递,因此它不携带任何元数据。

我如何在这里获取列数据类型?

数据仓库:雪花

stack overflow Get column names AND types using star macro in dbt
原文答案
author avatar

接受的答案

您可以查看 dbt_utils.star here 的源代码

在引擎盖下,它使用 dbt_utils.get_filtered_columns_in_relation 。该宏也只返回列名。然而!该宏使用内置的 adapter.get_columns_in_relation ,它返回 Column 对象的列表,这些对象具有 data_type 属性。

所以你的代码变成:

{% set all_columns = adapter.get_columns_in_relation(
    ref("my_table")
) %}
{% set except_col_names=["a", "b", "c"] %}

select 
    date_trunc('week', day) as week,
    name,

    {%- for col in all_columns if col.name not in except_col_names %}  
    {% if col.data_type == 'BOOLEAN' %}  
    max({{ col.name|lower }}) as {{ col.name|lower }}{%- if not loop.last %},{{ 'n  ' }}{% endif %}
    {% endif %}
    {%- endfor %}

from {{ ref('my_table_name') }}    
group by 1, 2

答案: