dbt에서 Jinja 고급 사용

사례 연구: dbt로 전자상거래 데이터 모델 구축

Susan Sun

Freelance Data Scientist

Jinja 문: 루프

Jinja {% %}로 감쌉니다:

  • 항목을 반복 처리
    • 템플릿:
      {% for ... %} ... {% endfor %}
      
    • 예시:
      {% for order_status in order_statuses %}
        SUM(
            CASE WHEN status = '{{ order_status }}' 
              THEN order_id 
            END)
      {% endfor %}
      
사례 연구: dbt로 전자상거래 데이터 모델 구축

Jinja 문: 루프

반복되는 SQL:

SELECT 
    user_id,
    SUM(CASE WHEN status = 'Shipped' THEN 1 ELSE 0 END) 
        AS num_orders_Shipped,
    SUM(CASE WHEN status = 'Complete' THEN 1 ELSE 0 END) 
        AS num_orders_Complete,
    SUM(CASE WHEN status = 'Processing' THEN 1 ELSE 0 END) 
        AS num_orders_Processing,        
FROM {{ ref('stg_looker__orders') }}
GROUP BY 1
사례 연구: dbt로 전자상거래 데이터 모델 구축

Jinja 문: 루프

{% set order_statuses = ['Shipped', 'Complete', 'Processing'] %}

SELECT 
    user_id,
    -- Jinja loop
    {% for order_status in order_statuses %}
        SUM(CASE WHEN status = '{{ order_status }}' THEN 1 ELSE 0 END) 
        -- Parametrized column name
        AS num_orders_{{ order_status }}
    {% endfor %}
FROM {{ ref('stg_looker__orders') }}
GROUP BY 1
사례 연구: dbt로 전자상거래 데이터 모델 구축

Jinja 문: 루프

dbt compile 출력:

SELECT 
    user_id,
    SUM(CASE WHEN status = 'Shipped' THEN 1 ELSE 0 END) 
        AS num_orders_Shipped,
    SUM(CASE WHEN status = 'Complete' THEN 1 ELSE 0 END) 
        AS num_orders_Complete,
    SUM(CASE WHEN status = 'Processing' THEN 1 ELSE 0 END) 
        AS num_orders_Processing,        
FROM "dbt"."main"."stg_looker__orders"
GROUP BY 1
사례 연구: dbt로 전자상거래 데이터 모델 구축

Jinja 문: 매크로

Jinja 매크로:

  • Jinja로 작성된 함수입니다
  • 재사용 가능합니다
  • /macros 폴더에 저장합니다

COALESCE():

  • 첫 번째 NULL이 아닌 값을 반환
  • 문법: COALESCE(value1, value2, ...)
  • 예: COALESCE(nickname, first_name)

매크로 함수 예시:

IDE 스크린샷. IDE 편집기에서 `coalesce_and_round.sql` 파일이 열려 있으며 매크로 로직이 보입니다.

사례 연구: dbt로 전자상거래 데이터 모델 구축

Jinja 문: 매크로

Jinja {% %}로 감쌉니다:

  • 재사용 가능한 매크로 함수:
    • 템플릿:
      {% macro ... %} ... {% endmacro %}
      
    • 예시:
      {% macro coalesce_and_round(column_name, decimal_places = 2) %}
            ROUND(COALESCE({{ column_name }}, 0), {{ decimal_places }})
      {% endmacro %}
      
사례 연구: dbt로 전자상거래 데이터 모델 구축

Jinja 문: 매크로

  • 반복되는 SQL
    ROUND(COALESCE(sales_amount, 0), 2) AS sales_amount,
    ROUND(COALESCE(cost_of_goods_sold, 0), 2) AS cost_of_goods_sold,
    
  • DRY(반복 금지) 원칙
    • coalesce_and_round.sql 매크로 생성
    • /macros에 저장
    • 호출:
      {{ coalesce_and_round('sales_amount', 2) }} AS sales_amount,
      {{ coalesce_and_round('cost_of_goods_sold', 2) }} AS cost_of_goods_sold,
      
사례 연구: dbt로 전자상거래 데이터 모델 구축

Jinja 공백 관리

원본:

{% set traffic_source_values = ['Adwords', 'Email', 'Facebook'] %}
{% set browser_values = ['Chrome', 'Firefox', 'Safari', 'IE', 'Other'] %}

SELECT 
    user_id,
    COUNT(DISTINCT session_id) AS num_web_sessions,
...
사례 연구: dbt로 전자상거래 데이터 모델 구축

Jinja 공백 관리

컴파일 결과:




SELECT 
    user_id,
    COUNT(DISTINCT session_id) AS num_web_sessions,
... 
사례 연구: dbt로 전자상거래 데이터 모델 구축

Jinja 공백 관리

  • {%- ... %}이전 공백을 제거.
  • {% ... -%}이후 공백을 제거.
  • {%- ... -%}둘 다 제거.

  • 예시:

{%- set traffic_source_values = ['Adwords', 'Email', 'Facebook'] -%}
{%- set browser_values = ['Chrome', 'Firefox', 'Safari', 'IE', 'Other'] -%}

SELECT 
    user_id,
    COUNT(DISTINCT session_id) AS num_web_sessions,
...
사례 연구: dbt로 전자상거래 데이터 모델 구축

연습해 봅시다!

사례 연구: dbt로 전자상거래 데이터 모델 구축

Preparing Video For Download...