如何让dbt macro返回纯数据列表而非带agate.Row前缀的结果?
解决dbt宏中run_query返回agate.Row前缀的问题
你用run_query执行查询后返回的是agate.Table对象,直接返回会显示agate.Row前缀,需要提取行内的纯字段值,以下是两种可行的处理方案:
方案一:遍历行提取值(直观写法)
{% macro customer_id_fetcher() %} {% set query %} select distinct customer_id from {{ ref('table_name') }} {% endset %} {% set result = run_query(query) %} {% if result %} {% set customer_ids = [] %} {% for row in result.rows %} {% do customer_ids.append(row.customer_id) %} <!-- 也可以用索引方式:row[0],适合不确定字段名的场景 --> {% endfor %} {{ return(customer_ids) }} {% else %} {{ return([]) }} {% endif %} {% endmacro %}
关键说明:
result.rows获取所有行的迭代器,每个元素是agate.Row对象- 通过
row.字段名或row[索引]提取纯值 - 用
{% do %}语句往空列表中添加元素(Jinja不能直接调用列表append方法,需要do关键字) - 增加空结果判断,避免无数据时触发报错
方案二:用Jinja过滤器简化写法
{% macro customer_id_fetcher() %} {% set query %} select distinct customer_id from {{ ref('table_name') }} {% endset %} {% set result = run_query(query) %} {{ return(result.rows | map(attribute='customer_id') | list if result else []) }} {% endmacro %}
关键说明:
map(attribute='customer_id')过滤器遍历所有行,提取指定字段的值| list把过滤后的结果转换成标准列表- 三元表达式处理空结果,直接返回空列表
内容的提问来源于stack exchange,提问作者mikelowry
相关产品推荐
相关产品推荐

