You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dbt_utils.unpivot时,如何通过宏生成正则匹配的排除列列表?

问题:dbt中用正则生成unpivot排除列列表报错

我在Snowflake用dbt构建模型,其中一个模型包含大量列,想用dbt_utils.unpivot对部分列做逆透视操作。不想硬编码逆透视时需排除的列列表,希望通过宏利用正则表达式过滤列来生成该列表。

我的模型代码:

WITH unpivot as (

{{ 
  dbt_utils.unpivot(
  relation=ref('my_other_modell'),
  exclude= get_column_names('my_other_modell',regex='^F.*'),
  field_name='vairable_name',
  value_name='vairable_value'
) }})



SELECT * FROM unpivot

我的宏代码:

{% macro get_column_names(model_name, regex='+*') %}
    {%- set columns = adapter.get_columns_in_relation(ref(model_name)) -%}
    {%- set column_names = [] -%}
    {%- set re = modules.re %}
    
    {%- for column in columns %}
          {%- if not re.match(regex, column.name) %}
            {%- set _ = column_names.append(column.name) %}
        {%- endif %}
    {%- endfor %}
    
    {{ column_names}}
{% endmacro %}

尝试过将{{ column_names }}替换为{{ column_names|join(',') }},但始终遇到语法错误,例如:

syntax error line 16 at position 0 unexpected ','.
syntax error line 17 at position 17 unexpected ','.
syntax error line 18 at position 17 unexpected ','.
syntax error line 19 at position 17 unexpected ','.
syntax error line 20 at position 17 unexpected ','.


错误原因

dbt_utils.unpivot的exclude参数需要的是带引号的列名字符串(用逗号分隔),当前宏的输出要么是Python列表格式(带方括号和引号),要么是无引号的逗号拼接字符串,都不符合参数要求。

修正方案

1. 修改宏代码

调整宏,输出符合dbt和Snowflake要求的带引号列名,同时处理正则默认值和列名特殊字符问题:

{% macro get_column_names(model_name, regex='^.*$') %}
    {%- set columns = adapter.get_columns_in_relation(ref(model_name)) -%}
    {%- set column_names = [] -%}
    {%- set re = modules.re %}
    
    {%- for column in columns %}
          {%- if not re.match(regex, column.name) %}
            {%- set quoted_col = adapter.quote(column.name) %}
            {%- set _ = column_names.append(quoted_col) %}
        {%- endif %}
    {%- endfor %}
    
    {{ column_names|join(', ') }}
{% endmacro %}

2. 修正模型代码细节

修正拼写错误,并确保参数传递正确:

WITH unpivot as (
{{ 
  dbt_utils.unpivot(
    relation=ref('my_other_modell'),
    exclude= get_column_names('my_other_modell', regex='^F.*'),
    field_name='variable_name',
    value_name='variable_value'
  ) 
}})
SELECT * FROM unpivot

额外注意点

  • 原宏中的默认正则'+*'是无效表达式,改为'^.*$'(匹配所有列)更合理
  • 修正了模型中vairable_name/vairable_value的拼写错误
  • 使用adapter.quote()确保Snowflake中大小写敏感或带特殊字符的列能被正确识别

内容的提问来源于stack exchange,提问作者Nalso1551

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:57:25