Databricks 데이터 엔지니어

Databricks 데이터 엔지니어 11강

[Professional] 증분 처리 심화 — MERGE·CDF·SCD

이번 강은 변경 데이터를 다루는 MERGE·Change Data Feed·SCD를 다룬다.

Databricks 11강 개념도

원천에서 삽입·수정·삭제가 섞여 들어올 때, 이를 타깃에 정확히 반영하고 이력까지 관리하는 방법이다.

이 강의 목표는 다음과 같다.

  • MERGE로 upsert를 구현한다.
  • Change Data Feed로 변경을 하류에 전파한다.
  • SCD Type 1/2로 차원 이력을 관리한다.

1. MERGE — upsert

MERGE 한 문장으로 "있으면 갱신, 없으면 삽입, 조건 맞으면 삭제"를 처리한다.

MERGE INTO tgt USING src ON tgt.id = src.id
WHEN MATCHED AND src.op = 'delete' THEN DELETE
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;

중복 소스가 있으면 MATCHED가 모호해져 실패하므로, 소스를 먼저 중복 제거(dedup)한다.

2. Change Data Feed (CDF)

CDF를 켜면 테이블의 행 단위 변경(insert/update/delete)을 조회할 수 있다.

ALTER TABLE tgt SET TBLPROPERTIES (delta.enableChangeDataFeed = true);
SELECT * FROM table_changes('tgt', 5);   -- 버전 5 이후 변경분
  • 하류 파이프라인이 전체가 아닌 바뀐 행만 읽어 증분 처리한다.

3. SCD (Slowly Changing Dimension)

차원 데이터가 시간에 따라 바뀔 때의 처리 방식이다.

유형 방식
Type 1 덮어쓰기(이력 없음)
Type 2 새 행 추가 + 유효기간(start/end)·현재 플래그로 이력 보존

Type 2는 MERGE로 기존 현재 행을 만료시키고 새 버전 행을 삽입해 구현한다.

예제

예제) 고객의 주소가 바뀌어도 과거 주문이 어느 주소로 갔는지 이력을 남겨야 한다. 어떤 방식인가?

해설) SCD Type 2다. 주소가 바뀌면 기존 행의 end_date를 채워 만료시키고, 새 주소로 현재 플래그가 켜진 새 행을 추가한다. MERGE로 만료 UPDATE와 새 행 INSERT를 함께 처리한다. 과거 주문은 당시 유효했던 행과 조인되어 이력이 보존된다.

샘플 문제

문) 하류 파이프라인이 전체 재처리 없이 바뀐 행만 소비하게 하려면?

  • (A) VACUUM 활성화
  • (B) Change Data Feed 활성화 후 table_changes 조회
  • (C) OPTIMIZE ZORDER
  • (D) 매번 전체 OVERWRITE

정답: (B). CDF를 켜면 행 단위 변경을 조회할 수 있어, 하류는 바뀐 행만 증분 처리한다.

정리

  • MERGE로 upsert·삭제를 한 문장에 처리(소스 중복은 먼저 dedup).
  • CDF로 행 단위 변경을 조회해 하류에 증분 전파한다.
  • SCD Type 1은 덮어쓰기, Type 2는 유효기간으로 이력 보존.
  • Type 2는 MERGE로 만료+삽입을 함께 구현한다.

다음 강에서는 이 데이터를 어떻게 모델링하는지 다룬다.

댓글 0