DBT에서 데이터 관리하기

2025. 2. 9.·학습 주제/DBT
 

DBT에서 데이터 관리하기

 

 

출처: https://medium.com/@spchaithrajp

dbt Seeds

Seeds란?

데이터 웨어하우스에서 크기가 작고 자주 변경되지 않는 Dimension 테이블을 효율적으로 관리하기 위해 Seeds를 활용

  • Seeds는 작은 정적 데이터 파일(보통 CSV)을 의미합니다.
  • dbt seed 명령어를 실행하여 데이터를 테이블로 로드할 수 있습니다.

Seeds 실습

  1. seeds 폴더 아래 CSV 파일 생성
  2. dbt seed 실행 시 해당 파일을 테이블로 변환
  3. SQL에서 {{ ref("파일명") }} 형식으로 참조 가능
# 예시: reference_date.csv 파일을 추가 후 실행
seeds/reference_date.csv  # reference_date 테이블 생성
dbt seed  # CSV 파일을 테이블로 변환


dbt Sources

Sources란?

ETL 파이프라인에서 입력 테이블이 자주 변경될 경우, 이를 직접 참조하면 유지보수가 어려워질 수 있습니다. Sources를 사용하면 이러한 문제를 해결할 수 있습니다.

  • 입력 테이블에 별칭을 제공하여 추상화
  • 최신 데이터 확인 기능 제공
  • ETL 파이프라인이 변경되더라도 종속된 모델을 쉽게 수정 가능

Sources 실습

  1. models/sources.yml 파일 생성 및 테이블 별칭 설정
  2. source("별칭", "테이블명") 형식으로 참조

version: 2
sources:
  - name: yeojun
    schema: raw_data
    tables:
      - name: metadata
        identifier: user_metadata
      - name: event
        identifier: user_event
      - name: variant
        identifier: user_variant

Source 최신성(Freshness) 확인

- name: event
  identifier: user_event
  loaded_at_field: datestamp  # freshness를 결정하는 필드
  freshness:
    warn_after: {count: 1, period: hour}  # 1시간 이상 경과 시 Warning
    error_after: {count: 24, period: hour}  # 24시간 이상 경과 시 Error
dbt source freshness  # 소스 최신성 확인
## sources.yml
vi models/sources.yml
vi src/src_user_metadata.sql
vi src/src_user_variant.sql
vi src/src_user_event.sql

## dbt freshness
vi models/sources.yml
dbt source freshness # 업데이를 한지 오래되어서 Error 발생
date # 나온 값을 snowflake insert를 사용해서 업데이트 
# insert into dev.raw_data.user_event values (101, '2025-02-08 18:00:00', 101, 1, 0, 0);
dbt source freshness


dbt Snapshots

Snapshots이란?

Dimension 테이블에서 특정 엔터티의 속성이 변경될 경우, 이를 추적하기 위해 Snapshots을 사용할 수 있습니다.

  • 변경 이력을 저장하여 특정 시점으로 롤백 가능
  • 과거 데이터를 조회할 수 있어 디버깅 용이
  • SCD (Slowly Changing Dimension) Type 2 지원

dbt Snapshot 설정

  1. snapshots 폴더에 SQL 파일 생성
  2. unique_key와 updated_at 필드 지정
{% snapshot scd_user_metadata %}
{ {
    config(
        target_schema="raw_data",
        unique_key="user_id",
        strategy="timestamp",
        updated_at='updated_at',
        invalidate_hard_deletes=True
    )
} }
SELECT * FROM {{ source('yeojun', 'metadata') }}
{% endsnapshot %}
vi snapshots/scd_user_metadata.sql
dbt snapshot

-- 예시: 특정 레코드 수정 후 다시 실행
-- UPDATE raw_data.user_metadata SET age ='30-39', updated_at = GETDATE()  WHERE user_id = 99;
dbt snapshot


dbt Tests

Tests란?

dbt는 데이터 품질을 보장하기 위해 테스트 기능을 제공합니다.

  • Generic Tests: 기본적으로 제공하는 테스트 (unique, not_null, relationships 등)
  • Singular Tests: SQL 기반의 사용자 정의 테스트

Generic Tests 구현

-- models/schema.yml 파일에서 테스트 정의
version: 2
models:
  - name: dim_user_metadata
    columns:
      - name: user_id
        tests:
          - unique
          - not_null

Singular Tests 구현

-- tests/dim_user_metadata.sql
-- Primary key Uniqueness 테스트
SELECT *
FROM (
    SELECT user_id, COUNT(1) AS cnt
    FROM {{ ref("dim_user_metadata") }}
    GROUP BY 1
    HAVING COUNT(1) > 1
);
dbt test --select dim_user_metadata  # 특정 모델 테스트 실행
dbt --debug test --select dim_user_metadata  # 디버깅 모드 실행

dbt Documentation

dbt 문서화란?

dbt는 문서화 기능을 제공하여 데이터 모델과 문서를 함께 유지할 수 있습니다.

  • .yml 파일 내에서 직접 문서화 가능
  • 독립적인 Markdown 파일(overview.md)을 생성하여 문서화 가능
  • 웹 UI를 통해 문서 및 Lineage Graph 시각화 지원

문서화 추가 방법

-- models/schema.yml, models/sources.yml에 description 추가
version: 2
models:
  - name: dim_user_metadata
    description: A dimension table with user metadata
    columns:
      - name: user_id
        description: The primary key of the table
        tests:
          - unique
          - not_null

문서화 실행

dbt docs generate  # 문서 생성
dbt docs serve  # 웹 UI 제공

dbt Expectations

dbt Expectations란?

Great Expectations에서 영감을 받아 데이터 품질 보장 기능을 dbt에서 확장한 플러그인입니다.

  • 패키지 설치 후 packages.yml에 추가
packages:
  - package: calogica/dbt_expectations
    version: [">=0.7.0", "<0.8.0"]
  • 기존 dbt의 Generic Tests와 함께 사용 가능
models:
  - name: dim_user_metadata
    columns:
      - name: age
        tests:
          - dbt_expectations.expect_column_values_to_be_between:
              min_value: 0
              max_value: 100
dbt test --select dim_user_metadata  # Expectations 테스트 실행

 

'학습 주제 > DBT' 카테고리의 다른 글

데이터 카탈로그  (0) 2025.02.09
DBT Models 데모  (0) 2025.02.09
DBT(Data Build Tool)이란?  (0) 2025.02.09
'학습 주제/DBT' 카테고리의 다른 글
  • 데이터 카탈로그
  • DBT Models 데모
  • DBT(Data Build Tool)이란?
굥여9
굥여9
9idryd 님의 블로그 입니다.
  • 굥여9
    문과의 개발
    굥여9
  • 전체
    오늘
    어제
    • 분류 전체보기 (114)
      • 학습 주제 (86)
        • 자료구조와 알고리즘 (8)
        • HTML & 웹크롤링 (4)
        • 데이터 시각화 (4)
        • Django & Django Rest Framew.. (11)
        • AWS 클라우드 (6)
        • SQL & 데이터 웨어하우스 (11)
        • 데이터파이프라인과 Airflow (12)
        • Docker & K8S (8)
        • DBT (4)
        • CI & CD (1)
        • 빅데이터 처리와 Spark (12)
        • Kafka & Spark Streaming (5)
        • 보안 엔지니어링 (0)
      • 구름 프로펙트 클라우드 엔지니어링 (0)
        • [Monolithic] 서비스의 기초와 설계 (0)
        • [MSA & EDA] 비동기 전환과 정합성 (0)
        • [Cloud Native] K8s 기반 인프라와 .. (0)
      • 프로그래머스 데브코스 데이터 엔지니어링 (4)
      • 개발 기록 (24)
        • 일일 (24)
        • 주간 (0)
      • 회고 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
굥여9
DBT에서 데이터 관리하기
상단으로

티스토리툴바