在dbt(JINJA)环境下如何将单字段分隔值拆分为多行生成新表
结论
完全可以实现,优先推荐用BigQuery原生语法配合dbt直接开发,逻辑简单性能好,也可以用Jinja封装为可复用的宏适配多场景使用。
基础实现方案(无需额外Jinja逻辑)
直接在dbt模型的SQL文件中使用BigQuery原生的SPLIT+UNNEST语法即可完成拆分,示例代码如下:
-- 先引入你的原始表,这里用source配置为例,也可以直接写ref引用上游dbt模型 WITH raw_tag_data AS ( SELECT ID, Tag FROM {{ source('你的数据源名称', '原始标签表名') }} ) SELECT ID, TRIM(split_tag) AS Tag -- TRIM用于清理拆分后可能存在的前后空格 FROM raw_tag_data, -- 按逗号拆分Tag字段为数组,再把数组元素打散为独立行 UNNEST(SPLIT(Tag, ',')) AS split_tag
这段SQL会直接被dbt下发到BigQuery执行,运行后得到的结果就是你需要的一行对应一个标签的结构。
可复用Jinja宏实现
如果有多个表都需要做类似的分隔字段拆分行操作,可以把逻辑封装为Jinja宏减少重复代码:
- 首先在dbt项目的
macros目录下新建split_to_rows.sql文件,写入宏定义:
{% macro split_to_rows(input_table, split_column, delimiter=',') %} SELECT t.* EXCEPT({{ split_column }}), TRIM(split_val) AS {{ split_column }} FROM {{ input_table }} t, UNNEST(SPLIT(t.{{ split_column }}, '{{ delimiter }}')) AS split_val {% endmacro %}
- 在需要拆分逻辑的模型中直接调用宏即可:
{{ split_to_rows(source('你的数据源名称', '原始标签表名'), 'Tag', ',') }}
内容的提问来源于stack exchange,提问作者SQL guy
相关产品推荐
相关产品推荐

