목차
Change Data Capture (CDC)
CDC (Change Data Capture)는 데이터 소스에서 발생하는 삽입, 수정, 삭제 같은 변경 사항을 감지하고
대상 시스템에 이를 반영하는 방식이다.

CDC 이벤트 종류
- 삽입 (Insert): 새로운 레코드 추가
- 수정 (Update): 기존 레코드 변경
- 삭제 (Delete): 기존 레코드 제거
CDC Feed?
CDC 피드는 레코드의 전체 데이터 + 메타데이터를 포함한 변경 이벤트다.
여기에는 다음 정보가 포함됨:
- 변경된 데이터 레코드
- 변경 유형 (insert, update, delete)
- 버전 번호 또는 타임스탬프 → 변경 순서를 나타냄
Delta Lake에서의 CDC 처리 방법
CDC 처리는 MERGE INTO 문을 통해 삽입, 수정, 삭제를 한 번에 처리할 수 있다.
MERGE INTO target_table t
USING source_updates s
ON t.key_field = s.key_field
WHEN MATCHED AND t.sequence_field < s.sequence_field THEN
UPDATE SET *
WHEN MATCHED AND s.operation_field = "DELETE" THEN
DELETE
WHEN NOT MATCHED THEN
INSERT *;
핵심 포인트:
- key 기반으로 매칭
- 시퀀스/타임스탬프가 더 최신일 때만 업데이트
- DELETE 이벤트는 삭제로 처리
- 매칭되지 않으면 INSERT
⚠️ 주의 사항
- 중복 키가 CDC 피드에 존재할 경우 MERGE 실패 발생 가능
- 동일한 키에 대해 여러 업데이트가 존재하면 예외 발생
따라서 CDC 피드를 사전에 정제해야 함:
ROW_NUMBER() OVER (PARTITION BY key ORDER BY update_time DESC)또는RANK()활용- 가장 최신 변경 사항만 유지
- 주의 : rank() 같은 non-time-based window 함수는 스트리밍에서 지원되지 않음.
Delta Lake CDF (Change Data Feed)

Change Data Feed(CDF)는 델타 레이크 테이블에서 발생한 모든 변경사항을 자동 추적해주는 기능이다.
쉽게 말해, 행 단위의 변경 내역(insert, update, delete)을 기록해주는 기능으로, CDC의 델타 레이크 버전이라고 보면 된다.
CDF 동작 방식
📌 version 1 table
| Country ID | Country | Vaccination Rate |
|---|---|---|
| FR | France | 0.7 |
| CA | Canada | 0.65 |
| IN | India | 0.6 |
변경 작업:
- France → 0.7 → 0.75 (수정)
- USA (US | USA | 0.5) 추가
📌 version 2 table
| Country ID | Country | Vaccination Rate |
|---|---|---|
| FR | France | 0.75 |
| CA | Canada | 0.65 |
| IN | India | 0.6 |
| US | USA | 0.5 |
📌 CDF 결과 (table_changes)
| Country ID | Country | Vaccination Rate | change_type | time | version |
|---|---|---|---|---|---|
| FR | France | 0.7 | update_preimage | 07:00:00 | 2 |
| FR | France | 0.75 | update_postimage | 07:00:00 | 2 |
| US | USA | 0.5 | insert | 07:00:00 | 2 |
삭제(delete)일 경우에는 한 줄로 change_type = delete가 기록된다.
예:
| CA | Canada | 0.65 | delete | 08:00:00 | 3 |
※ 변경 없는 레코드(IN, 등)는 출력되지 않는다.
CDF 쿼리 방법
-- 버전 기준
SELECT * FROM table_changes('table_name', start_version [, end_version]);
-- 타임스탬프 기준
SELECT * FROM table_changes('table_name', start_timestamp [, end_timestamp]);
원하는 시점의 변경 데이터를 버전 또는 타임스탬프 기반으로 조회 가능하다.
활용 사례
- 멀티홉 아키텍처에서 유용 (예: Silver → Gold 테이블 증분 처리)
- 삽입, 수정, 삭제를 모두 반영해야 하는 ETL 파이프라인에 적합
- Append-only 구조에는 필요 없음
CDF 활성화
ALTER TABLE customers_silver SET TBLPROPERTIES (delta.enableChangeDataFeed = true);
기존 customers_silver Delta 테이블에 CDF 기능을 활성화. 이후 삽입/수정/삭제 변경 내역이 자동 추적된다.
테이블의 속성을 확인해보자.
DESCRIBE TABLE EXTENDED customers_silver;
delta.enableChangeDataFeed = true 속성이 존재하는지 확인할 수 있다.
결과 :
Table Properties: [delta.enableChangeDataFeed=true, delta.minReaderVersion=1, delta.minWriterVersion=4]
테이블의 변경 이력을 확인해보자.
DESCRIBE HISTORY customers_silver;
(버전, 작업 종류, 시간 등)
예시:
| version | operation | timestamp |
|---|---|---|
| 2 | SET TBLPROPERTIES | 2025-05-07 15:29:01 |
| 1 | MERGE | 2025-05-07 15:12:01 |
| 0 | CREATE | 2025-05-07 15:01:00 |
→ 나중에 CDF 확인 시 version 번호 사용하므로 반드시 메모해둘 것!
특정 버전의 CDF 확인 (SQL 방식)
SELECT * FROM table_changes("customers_silver", 2);
- customers_silver 테이블의 version 2부터 발생한 변경 사항을 추적
- 생성 당시부터 CDF가 활성화되어 있었다면 version 0도 사용 가능
예시 결과:
| _change_type | customer_id | _commit_version | _commit_timestamp |
|---|---|---|---|
| update_preimage | C00003 | 3 | 2025-05-07 15:12:00 |
| update_postimage | C00003 | 3 | 2025-05-07 15:12:00 |
| insert | C00007 | 3 | 2025-05-07 15:12:00 |
update_preimage: 수정 전 행update_postimage: 수정 후 행insert: 새로 삽입된 데이터- delete 연산도 기록되지만, 예제에서는 생략했음.
- append only 테이블이라면 CDF를 굳이 활성화할 필요 없음
- Silver → Gold로 증분 처리할 때 매우 유용하다
참고 자료
https://docs.databricks.com/aws/en/dlt/what-is-change-data-capture
https://delta.io/blog/2023-07-14-delta-lake-change-data-feed-cdf/
'Data Engineering > Databricks' 카테고리의 다른 글
| [databricks] 파일 최적화(자동 최적화와 수동 최적화) (0) | 2025.06.09 |
|---|---|
| [databricks] 테이블 복사(CTAS , Shallow Clone, Deep Clone) (1) | 2025.06.09 |
| [databricks] Slowly Changing Dimensions(SCD) (2) | 2025.06.05 |
| [databricks] Delta Table 제약 조건 추가 및 위반처리 (1) | 2025.06.05 |
| [databricks] Struct Streaming Deduplication (1) | 2025.06.05 |