如何在DBT中使用Jinja遍历嵌套struct并提取指定value字段
解决方案
你之前的代码不生效的核心原因是:Jinja是DBT的编译期模板工具,运行时无法直接读取SQL查询结果里的struct内部字段,你需要先通过DBT的内置方法拿到properties结构体的所有子字段名,再做遍历。
方案1:子struct命名有统一规律(如property1~propertyN)
如果你的子struct都是按property+数字的规则命名,直接遍历数字范围即可,写法最简单:
WITH t as ( SELECT properties FROM src ) SELECT {% for i in range(1, 101) %} properties.property{{i}}.value as property{{i}}_value {%- if not loop.last %},{% endif %} {% endfor %} FROM t
方案2:子struct命名无规律,需要自动读取字段名
用DBT的adapter.get_columns_in_query方法先查询一次表结构,拿到properties下的所有子字段名,再做遍历:
{# 先拿到properties结构体的所有子字段名 #} {% set property_cols = [] %} {% set all_cols = adapter.get_columns_in_query('SELECT properties FROM src LIMIT 0') %} {% for col in all_cols[0].fields %} {% do property_cols.append(col.name) %} {% endfor %} WITH t as ( SELECT properties FROM src ) SELECT {% for prop_name in property_cols %} properties.{{prop_name}}.value as {{prop_name}}_value {%- if not loop.last %},{% endif %} {% endfor %} FROM t
注:如果你的数据仓库是Snowflake,
fields属性可能需要换成column.fields,BigQuery环境上述写法可直接生效。如果执行报错,可以先加{{ log(all_cols[0], info=True) }}打印字段结构,调整取值逻辑即可。
内容的提问来源于stack exchange,提问作者Gus
相关产品推荐
相关产品推荐

