使用dbt_utils.unpivot实现列转行遇问题,求修正及落地方法
修正dbt_utils.unpivot列转行代码及写入Staging层问题
需求说明
原数据源包含PartID、Col1、Col2、Col3列,需要转换为列转行结构:保留PartID,新增Unpivcol(存储原列名Col1/Col2/Col3)和Unpivval(存储对应列的值)。
原代码问题
你当前的dbt_utils.unpivot参数使用错误:
field_name和value_name应为单个字符串,而非数组- 参数逻辑混淆:
field_name用于指定保留不转行的列,你错误传入了所有列;value_name是值列的名称,无需包含PartID
修正后的代码
方式一:通过exclude指定保留列
{{ dbt_utils.unpivot( relation=ref("resp_data"), -- 关联Staging层的数据源表 cast_to="varchar", -- 将值统一转换为varchar类型 exclude=["PartID"], -- 保留不参与转行的PartID列 column_name="Unpivcol", -- 存储原列名的字段名 value_name="Unpivval" -- 存储对应列值的字段名 ) }}
方式二:通过include指定需要转行的列
{{ dbt_utils.unpivot( relation=ref("resp_data"), cast_to="varchar", include=["Col1", "Col2", "Col3"], -- 指定需要转行的列 column_name="Unpivcol", value_name="Unpivval" ) }}
关于写入Staging层表的问题
完全可以将生成的列转行数据写入Staging层表:
- 将上述修正后的代码放在Staging层的模型文件中(比如
models/staging/stg_unpivoted_resp_data.sql) - 若需要生成物理表而非默认视图,可在模型顶部添加配置:
{{ config(materialized='table') }} - 运行
dbt run命令,dbt会根据配置自动创建并写入数据到目标Staging层表中
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

