DBT에서 데이터 관리하기

dbt Seeds
Seeds란?
데이터 웨어하우스에서 크기가 작고 자주 변경되지 않는 Dimension 테이블을 효율적으로 관리하기 위해 Seeds를 활용
- Seeds는 작은 정적 데이터 파일(보통 CSV)을 의미합니다.
- dbt seed 명령어를 실행하여 데이터를 테이블로 로드할 수 있습니다.
Seeds 실습
- seeds 폴더 아래 CSV 파일 생성
- dbt seed 실행 시 해당 파일을 테이블로 변환
- SQL에서 {{ ref("파일명") }} 형식으로 참조 가능
# 예시: reference_date.csv 파일을 추가 후 실행
seeds/reference_date.csv # reference_date 테이블 생성
dbt seed # CSV 파일을 테이블로 변환

dbt Sources
Sources란?
ETL 파이프라인에서 입력 테이블이 자주 변경될 경우, 이를 직접 참조하면 유지보수가 어려워질 수 있습니다. Sources를 사용하면 이러한 문제를 해결할 수 있습니다.
- 입력 테이블에 별칭을 제공하여 추상화
- 최신 데이터 확인 기능 제공
- ETL 파이프라인이 변경되더라도 종속된 모델을 쉽게 수정 가능
Sources 실습
- models/sources.yml 파일 생성 및 테이블 별칭 설정
- 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 설정
- snapshots 폴더에 SQL 파일 생성
- 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 |