【问题标题】:Using column as a parameter in macro dbt jinja在宏 dbt jinja 中使用列作为参数
【发布时间】:2022-08-03 01:01:04
【问题描述】:

大家好, 我有 28 个表(模型)要创建。我需要对这些表进行一些转换。所以我决定使用宏不重复自己,并且将来会有更多的转变。 我想从列中删除 \'%\'、\'$\' 标志并将其转换为浮动。 \'%\' 什么时候除以 100。

  • 我必须提到我使用了引用: 标识符:真

我创建了这个模型:

SELECT  
    {{ clean_values(\'\"Data\"\') }} AS \"Data\"
FROM 
    {{ source(\'mml_staging_eastor\', \'DATAXIS_Development_indicators\') }}

我还创建了宏:

{% macro clean_values(value_column) -%}

   {% do log(node, info=true) %}

   {# {% set column_value = \'wme%mt\' %} #}
    
   {% set column_value = value_column %}

   {% set col_val_list = value_column | list %}

   {% if \'%\' in col_val_list %}
     \'{{ column_value | replace(\'%\', \'\') }}\'
   {% elif \'$\' in col_val_list %}      
     \'{{ column_value | replace(\'$\', \'\') }}\'
   {% else %}
     {{ col_val_list }}
   {% endif %}

{%- endmacro %}

在运行查询之前编译(模板化)宏。这意味着数据不会通过 jinja 模板运行。当您 {% set column_value = value_column %} 时,您只是将具有 value_column 值的字符串传递给 jinja,而不是来自具有该名称的字段的数据。

这是真的,我会在我的模型中得到如下结果: [ \“\“\“, \“数据\”, \”\”\” ].

可以使用 run_query 宏将数据拉入 jinja 上下文,但这很慢且容易出错。

*如果我使用注释行,那么专用字符串\'wme%mt\'变量它工作正常。

我该如何处理这个以在宏中清理此列?

先感谢您!*

    标签: macros jinja2 dbt


    【解决方案1】:

    我看到你找到了my other answer,它试图解释编译步骤和查询执行步骤之间的区别。但我认为你和那个人犯了同样的错误,你正在使用 jinja 对代表的字符串进行操作姓名的列,而不是使用 SQL 来操作数据在列中。

    您的宏需要编写可以在数据库中执行的 SQL。我无法从您的问题中完全判断 $% 是否在数据或列名中,但假设前者(并且您使用的是 Snowflake 或类似方言),您的宏看起来像这样(注意% 是一个 SQL 通配符,意思是“匹配任意数量的任意字符”,必须转义):

    {% macro clean_values(column_name) -%}
    case
        when {{ column_name }} like '%^%' escape '^' -- number ending with %
        then replace({{ column_name }}, '%', '')::float / 100.0
        when {{ column_name }} like '$%' -- number starting with $
        then replace({{ column_name }}, '$', '')::float
        else {{ column_name }}::float
    end
    {% endmacro %}
    

    我在这里使用了简单的转换运算符::,如果它不能将表达式转换为浮点数,它将引发异常。您可能更喜欢使用 TRY_TO_DOUBLE,如果该列包含 Snowflake 无法转换的任何值,它将返回 NULL 而不是引发异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多