使用 dbt 介绍 Jinja

案例研究:使用 dbt 构建电商数据模型

Susan Sun

Freelance Data Scientist

dbt 使用三种语言

dbt 使用三种语言:

  • SQL:用于转换
  • YAML:用于文档与测试
  • Jinja:用于模板
  • SQL 示例:

    SELECT * FROM ...
    
  • YAML 示例:

    - name: customers
      description: A data mart
    
  • Jinja 示例:

    FROM {{ ref('stg_looker__users') }}
    
案例研究:使用 dbt 构建电商数据模型

什么是 dbt Jinja

什么是 dbt Jinja?

  • 类 Python 的模板语言
  • 用于生成动态 SQL
  • 出现在 dbt 模型、宏、测试等

为何有用?

  • 更易协作
  • 减少重复(DRY),提升复用

dbt 中 Jinja 示例

  • 引用 dbt 模型

    SELECT *
    FROM {{ ref('stg_looker__users') }}
    
  • 创建循环

    {% for column in ['col1', 'col2'] %}
      SELECT {{ column }}
      FROM table_name
    {% endfor %}
    
案例研究:使用 dbt 构建电商数据模型

dbt Jinja 的类型

  1. Jinja 语句{%...%} 包裹
     {% set order_statuses = ['Shipped', 'Complete', 'Processing'] %}
    
  2. Jinja 表达式{{...}} 包裹
     SELECT * FROM {{ ref('stg_looker__users') }}
    
  3. Jinja 注释{# #} 包裹
     {# This is a comment #}
    
案例研究:使用 dbt 构建电商数据模型

Jinja 语句:set

  • Jinja 语句类型:setloopconditional(if/else)、macros

  • set 语句创建变量并赋值

    • 模板:
      {% set ... %}
      
    • 示例:
      {% set country = 'Australia' %}
      
案例研究:使用 dbt 构建电商数据模型

Jinja 与 dbt compile

用法

  • customers.sql 中,如下所示:
{% set country = 'Australia' %}

SELECT ...
FROM ...
WHERE country = '{{ country }}'

编译后代码

  • dbt compile -s customers.sql 输出:


SELECT ...
FROM ...
WHERE country = 'Australia'

案例研究:使用 dbt 构建电商数据模型

Jinja 与 dbt compile

  • 单个模型的终端输出
  • dbt compile -s customers.sql 输出:
Running with dbt=1.8.4
...
Compiled node 'customers' is:
WITH customer_base AS (
    SELECT 
...
    FROM "dbt"."main"."stg_looker__users"
    WHERE country = 'Australia'
)
...
  • 生成的 /target/compiled 目录
  • dbt compile 生成的编译文件:

dbt compile 子命令自动生成的一系列文件目录截图。顶层文件夹是 looker ecommerce dbt 项目。第二层为 `target`,第三层为 `compiled`。在 `compiled` 下,有一系列与 dbt 项目结构对应的目录,存放模型和测试的已编译查询。

案例研究:使用 dbt 构建电商数据模型

让我们来练习!

案例研究:使用 dbt 构建电商数据模型

Preparing Video For Download...