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

在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宏减少重复代码:

  1. 首先在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 %}
  1. 在需要拆分逻辑的模型中直接调用宏即可:
{{ split_to_rows(source('你的数据源名称', '原始标签表名'), 'Tag', ',') }}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:27:05