Delta Lake의 데이터 버전 관리 및 시간 이동

완료됨

Delta Lake의 뛰어난 기능 중 하나는 데이터 버전 관리와 시간 이동이며, 이를 통해 데이터의 이전 버전 관리에 액세스하고 되돌릴 수 있습니다. 이 기능은 변경 내용 감사, 실험 재현, 오류 롤백, 과거 정확도 유지에 유용합니다.

이 과정에서는 Azure Databricks에서 Delta Lake를 사용하여 데이터 버전 관리 및 시간 이동을 구현하고 사용하는 방법을 보여 줍니다.

Delta Lake 시간 여행을 이해하기

Delta Lake는 테이블에 적용된 모든 변경 내용에 대한 세부 정보를 기록하는 트랜잭션 로그를 사용하여 Delta 테이블의 데이터 버전을 추적합니다. 각 트랜잭션에는 0부터 시작하는 고유한 버전 번호가 있습니다. 이러한 버전을 사용하면 특정 시점의 데이터 상태에 액세스할 수 있습니다.

다음 SQL 예제에서는 델타 테이블을 만들고 2개의 레코드를 삽입합니다. 그런 다음 테이블에서 일부 업데이트를 수행합니다. 각 업데이트는 Delta 테이블의 새 버전을 만듭니다.

-- Create the Delta table
CREATE TABLE person_data (
    id INT,
    name STRING,
    age INT
);

-- Insert initial data
INSERT INTO person_data (id, name, age)
VALUES (1, 'Alice', 30), (2, 'Bob', 25);

-- Update age of Bob
UPDATE person_data
SET age = 26
WHERE name = 'Bob';

-- Insert a new record
INSERT INTO person_data (id, name, age)
VALUES (3, 'Charlie', 28);

이러한 버전은 변경할 수 없으므로 시간 이동과 같은 기능을 사용하여 언제든지 테이블의 상태를 다시 확인할 수 있습니다. 내부적으로 트랜잭션 로그 는 원장으로 작동하여 새로 추가된 파일, 제거된 파일, 메타데이터 또는 스키마 업데이트와 같은 모든 변경 내용을 기록합니다. 따라서 Delta Lake를 사용하면 테이블을 모든 버전에 있는 그대로 안정적으로 재현하고, 특정 변경한 사용자와 시기를 감사하고, 완전히 결정적인 방식으로 계산을 롤백하거나 다시 실행할 수 있습니다.

DESCRIBE HISTORY 명령은 작업 수행, 타임스탬프, 작업을 수행한 사용자 등의 세부 정보와 함께 테이블의 모든 버전 목록을 표시합니다.

-- View table history
DESCRIBE HISTORY person_data;

다음은 작업 시퀀스에 대한 간소화된 예제 출력입니다.

version 시간표시 사용자 이름 수술 작업 매개변수 operationMetrics
3 2025-09-11 12:40:00 alice@adventureworks.com WRITE 모드 = 추가 numFiles = 1, numOutputRows = 1
2 2025-09-11 12:35:00 alice@adventureworks.com 업데이트 predicate = (name = 'Bob') numRemovedFiles = 1, numAddedFiles = 1, numUpdatedRows = 1
1 2025-09-11 12:30:00 alice@adventureworks.com WRITE mode = Append numFiles = 1, numOutputRows = 2
0 2025-09-11 12:25:00 alice@adventureworks.com CREATE TABLE
  • 버전 0 → 테이블을 만들었습니다(스키마만 해당).
  • 버전 1 → 초기 삽입(Alice + Bob).
  • 버전 2 → Bob의 나이를 업데이트합니다(제거 + 파일 추가).
  • 버전 3 → Charlie를 삽입합니다.

시간 이동 질문

Delta Lake에서 VERSION AS OFTIMESTAMP AS OF 절을 사용하면 특정 시점에 존재했던 테이블을 쿼리할 수 있습니다. 사용하여 VERSION AS OF쿼리할 때 커밋 번호 TIMESTAMP AS OF 로 테이블 상태를 명시적으로 선택하고 지정된 시간 또는 그 이전에 만들어진 가장 최근의 커밋을 조회합니다. 어느 쪽이든 실제로 수행하는 작업은 델타에 테이블의 특정 기록 스냅샷을 구체화하라고 말하는 것입니다.

-- Query data as of version 0
SELECT * FROM person_data VERSION AS OF 0;

-- Query data as of a specific timestamp
SELECT * FROM person_data TIMESTAMP AS OF '2025-09-10T10:00:00Z';

이 메커니즘은 매우 일관된 읽기를 보장합니다. 기록 버전을 쿼리할 때 쿼리의 모든 부분에서 해당 스냅샷을 정확하게 확인하고 그 이후로 최신 커밋을 작성한 경우에도 다른 항목은 볼 수 없습니다. 이는 시간에 따라 데이터를 비교하거나, 원래 생성된 대로 보고서를 다시 실행하거나, 테이블이 어떻게 발전했는지 감사하려는 경우에 특히 유용합니다.

시간 여행은 또한 기억에 의해 제한됩니다. 이전 데이터 파일 및 무덤표 이력은 해당 작업에 의해 VACUUM 정리될 때까지만 사용할 수 있습니다. 즉, 해당 파일이 영구적으로 제거되면 기록 쿼리가 실패합니다. 감사 또는 재현성에 크게 의존하는 조직은 보존 기간을 신중하게 구성하여 필요한 한 기록 버전을 계속 사용할 수 있도록 합니다.

이전 버전으로 되돌리기

스냅샷은 변경할 수 없으므로 이전 버전을 직접 수정할 수 없습니다. 대신 이전 버전에서 테이블을 복사하거나 다시 만들거나 사용 가능한 경우 명령을 사용하여 RESTORE TABLE 이전 상태를 복원할 수 있습니다.

-- Restore the table to version 0
RESTORE TABLE person_data TO VERSION AS OF 0;

-- Restore the table to a specific timestamp
RESTORE TABLE person_data TO TIMESTAMP AS OF '2025-09-10T10:00:00Z';

변경 불가능성: 이전 상태로 되돌릴 수는 있지만, 복잡한 트랜잭션 내역을 방지하고 일관된 데이터 계보를 보장하려면 데이터를 변경 불가능한 것으로 취급합니다.

보존 정책: 명령을 사용하여 스토리지 용량 및 규정 준수 요구 사항에 따라 이전 버전의 보존 기간을 관리합니다 VACUUM .