能否在dbt models.yml中为列设唯一标识符以复用列定义?
dbt models.yml 复用列定义的正确方式
问题说明
需要在dbt的models.yml中定义可复用的列配置,在多个模型里重复使用,但之前的尝试遇到了问题:
- 尝试给列设置自定义唯一键(如下方示例)不符合dbt语法,无法被识别:
models: - name: my_model description: my model description columns: - unique_identifier_1: - name: column_name_1 description: column description 1 - unique_identifier_2: - name: column_name_2 description: column description 2
- 用YAML锚点定义列组后,用
<<:合并仅能保留第一个列,还会生成嵌套对象列表,无法得到平级的列定义:
id_columns: &id_columns - name: id1 description: unique identifier for user tests: - unique - name: id2 description: unique identifier for other thing tests: - unique common_columns: &common_columns - name: name description: Name of User models: - name: my_dbt_model description: my description columns: - <<: *id_columns - <<: *common_columns
解决方案
dbt不支持给列设置自定义唯一键,但可以通过两种正确的YAML锚点用法实现列定义复用:
方式1:单独定义每个列的锚点
将每个需要复用的列单独定义为锚点,在模型中逐个引用:
# 定义单个可复用列的锚点 &id1 name: id1 description: unique identifier for user tests: - unique &id2 name: id2 description: unique identifier for other thing tests: - unique &username name: name description: Name of User models: - name: my_dbt_model description: my description columns: - <<: *id1 - <<: *id2 - <<: *username
方式2:直接展开列组数组锚点
将列组定义为数组锚点,在模型的columns下直接展开数组,实现平级合并:
# 定义列组数组锚点 &id_columns - name: id1 description: unique identifier for user tests: - unique - name: id2 description: unique identifier for other thing tests: - unique &common_columns - name: name description: Name of User models: - name: my_dbt_model description: my description columns: # 直接展开两个列组数组,合并为平级列列表 *id_columns *common_columns
原理说明
- dbt的models.yml要求
columns是平级的列对象数组,每个元素必须是包含name、description等键的列定义,不能是带自定义键的嵌套结构,因此自定义唯一键的方式不可行。 - 之前用
- <<: *id_columns的错误在于,<<:是YAML的字典合并语法,而锚定的是数组,会导致整个数组被作为单个元素嵌套进columns数组,dbt无法解析;直接使用*id_columns则会将数组元素展开到columns中,生成平级的列列表。
内容的提问来源于stack exchange,提问作者bootica
相关产品推荐
相关产品推荐

