[databricks]Change Data Capture(CDC), Change Data Feed(CDF)
A A

목차

    728x90
    Change Data Capture (CDC)

     

    CDC (Change Data Capture)는 데이터 소스에서 발생하는 삽입, 수정, 삭제 같은 변경 사항을 감지하고

    대상 시스템에 이를 반영하는 방식이다.

     CDC 이벤트 종류
    1. 삽입 (Insert): 새로운 레코드 추가
    2. 수정 (Update): 기존 레코드 변경
    3. 삭제 (Delete): 기존 레코드 제거
    CDC Feed?

     

    CDC 피드는 레코드의 전체 데이터 + 메타데이터를 포함한 변경 이벤트다.

    여기에는 다음 정보가 포함됨:

    1. 변경된 데이터 레코드
    2. 변경 유형 (insert, update, delete)
    3. 버전 번호 또는 타임스탬프 → 변경 순서를 나타냄
    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://www.databricks.com/kr/blog/2021/06/09/how-to-simplify-cdc-with-delta-lakes-change-data-feed.html

    https://learn.aayushtuladhar.com/data-engineering/databricks-data-engineer-professional---course-prep/02---data-processing/01---change-data-capture/

    https://delta.io/blog/2023-07-14-delta-lake-change-data-feed-cdf/

    Copyright 2024. GRAVITY all rights reserved