증분 테이블 구성

이 문서에서는 Dataform Core를 사용하여 증분 테이블을 구성하는 방법을 보여줍니다.

증분 테이블 정보

Dataform은 테이블 유형에 따라 테이블을 다르게 업데이트합니다. 테이블 또는 뷰를 실행할 때마다 Dataform은 전체 테이블 또는 뷰를 처음부터 다시 빌드합니다.

증분 테이블을 정의하면 Dataform은 처음에만 증분 테이블을 처음부터 빌드합니다. 후속 실행 중에 Dataform은 구성한 조건에 따라 새 행만 증분 테이블에 삽입하거나 병합합니다.

Dataform은 이미 증분 테이블에 있는 열에만 새 행을 삽입합니다. 증분 열 정의 쿼리를 변경하는 경우(예: 새 열 추가) 테이블을 처음부터 다시 빌드해야 합니다. 이렇게 하려면 다음에 테이블 실행을 트리거할 때 전체 새로고침으로 실행 옵션을 선택합니다.

증분 테이블의 일반적인 사용 사례는 다음과 같습니다.

성능 최적화
웹 로그 또는 애널리틱스 데이터와 같은 일부 데이터의 경우 전체 테이블을 다시 처리하는 대신 새 레코드만 처리하는 것이 좋습니다.
지연 시간 감소
증분 테이블을 사용하여 워크플로를 자주 실행하지만 출력 테이블의 다운스트림 지연 시간을 줄일 수 있습니다.
일일 스냅샷
증분 테이블을 구성하여 테이블 데이터베이스에 대한 일일 스냅샷을 만들 수 있습니다. 예를 들어 프로덕션 데이터베이스에 저장된 사용자 설정의 종단적 분석을 수행할 수 있습니다.

시작하기 전에

  1. Google Cloud 콘솔에서 Dataform 페이지로 이동합니다.

    Dataform 페이지로 이동

  2. 저장소를 선택하거나 만듭니다.

  3. 개발 작업공간을 선택하거나 만듭니다.

  4. incremental 테이블 유형의 테이블을 만듭니다.

필요한 역할

증분 테이블을 구성하는 데 필요한 권한을 얻으려면 관리자에게 작업공간의 Dataform 편집자(roles/dataform.editor) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

증분 테이블의 행 하위 집합 처리

각 실행 중에 Dataform에서 처리할 행의 하위 집합을 확인하려면 증분 테이블 SQLX 정의 파일에 조건부 WHERE 절을 추가합니다. WHERE 절에서 증분 조건과 비증분 조건을 지정할 수 있습니다. Dataform은 테이블 실행 중에 전체 새로고침 없이 증분 조건을 적용하고, 전체 새로고침을 통해 실행 중에는 비증분 조건을 적용합니다.

증분 테이블을 구성하려면 다음 단계를 따르세요.

  1. 개발 작업공간으로 이동합니다.
  2. 파일 창에서 definitions/를 펼칩니다.
  3. 증분 테이블 정의 SQLX 파일을 엽니다.
  4. 다음 형식으로 WHERE 절을 입력합니다.

    config { type: "incremental" }
    
    SELECT_STATEMENT
    
    ${when(incremental(), `WHERE INCREMENTAL_CONDITION`, `WHERE NON_INCREMENTAL_CONDITION`) }
    

    다음을 바꿉니다.

    • SELECT_STATEMENT: 테이블을 정의하는 SELECT
    • INCREMENTAL_CONDITION: 전체 새로고침 없이 테이블 실행 중에 Dataform이 처리할 행을 선택하기 위해 WHERE 절에 지정하는 조건

    • NON_INCREMENTAL_CONDITION: 전체 새로고침으로 테이블을 실행하는 동안 Dataform이 처리할 행을 선택하기 위해 WHERE 절에 지정하는 조건

  5. (선택사항): 형식을 클릭합니다.

다음 코드 샘플은 productiondb.logs 테이블의 행을 점진적으로 처리하는 증분 테이블을 보여줍니다.

config { type: "incremental" }

SELECT timestamp, message FROM ${ref("productiondb", "logs")}

${when(incremental(),
   `WHERE date > (SELECT MAX(date) FROM ${self()}) AND country = "UK"`,
   `WHERE country = "UK"`)}

다음 코드 샘플에서는 productiondb.customers 테이블의 스냅샷을 만드는 증분 테이블을 보여줍니다.

config { type: "incremental" }

SELECT CURRENT_DATE() AS snapshot_date, customer_id, name, account_settings FROM ${ref("productiondb", "customers")}

${when(incremental(), `WHERE snapshot_date > (SELECT MAX(snapshot_date) FROM ${self()})`) }

증분 테이블의 행 병합

증분 테이블에 선택한 열 조합에 해당하는 행이 하나만 포함되도록 하려면 선택한 열을 uniqueKey로 설정하여 동일한 uniqueKey를 가진 행을 병합합니다. 테이블을 업데이트할 때 Dataform은 행을 추가하는 대신 uniqueKey와 병합합니다.

증분 테이블에서 병합을 구성하려면 다음 단계를 따르세요.

  1. 개발 작업공간으로 이동합니다.
  2. 파일 창에서 definitions/를 펼칩니다.
  3. 증분 테이블 정의 SQLX 파일 선택
  4. config 블록에서 선택한 열을 다음 형식으로 uniqueKey로 설정합니다.

    uniqueKey: ["COLUMN_NAME"]
    

    COLUMN_NAME을 선택한 열 이름으로 바꿉니다.

  5. (선택사항): 형식을 클릭합니다.

다음 코드 샘플은 항상 하나의 행을 포함하도록 transaction_id 열이 uniqueKey로 설정된 증분 테이블을 보여줍니다.

config {
  type: "incremental",
  uniqueKey: ["transaction_id"]
}

SELECT timestamp, action FROM weblogs.user_actions
${ when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }

증분 테이블의 행 필터링

파티션을 나눈 증분 테이블에서 Dataform 전체 테이블을 검색하여 일치하는 행을 찾지 않도록 하려면 레코드의 하위 집합만 고려하도록 updatePartitionFilter를 설정합니다.

다음 코드 샘플은 uniqueKeyupdatePartitionFilter 속성을 설정하여 병합이 구성된 파티션을 나눈 증분 테이블을 보여줍니다.

config {
  type: "incremental",
  uniqueKey: ["transaction_id"],
  bigquery: {
    partitionBy: "DATE(timestamp)",
    updatePartitionFilter:
        "timestamp >= timestamp_sub(current_timestamp(), interval 24 hour)"
  }
}

SELECT timestamp, action FROM weblogs.user_actions
${ when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }

파티션을 나눈 테이블에서 수집할 때 전체 테이블 스캔 방지

파티션을 나눈 테이블을 참조하는 증분 테이블을 만들 때는 각 증분 업데이트 중에 파티션을 나눈 테이블의 전체 테이블 스캔을 방지하도록 테이블 쿼리를 빌드하는 것이 좋습니다.

테이블 쿼리에 상수 표현식을 사용하여 증분 테이블을 업데이트하기 위해 BigQuery에서 스캔하는 파티션 수를 제한할 수 있습니다. 파티션을 나눈 테이블의 값을 상수 표현식으로 변환하려면 BigQuery 스크립팅을 사용하여 값을 pre_operations 블록의 변수로 선언합니다. 그런 다음 변수를 SELECT 쿼리의 WHERE 절에서 상수 표현식으로 사용합니다.

이 구성을 사용하면 Dataform은 전체 테이블을 스캔하지 않고 참조된 파티션을 나눈 테이블의 가장 최신 파티션을 기반으로 증분 테이블을 업데이트합니다.

파티션을 나눈 테이블을 참조하고 전체 테이블 스캔을 방지하는 증분 테이블을 구성하려면 다음 단계를 따르세요.

  1. 개발 작업공간으로 이동합니다.
  2. 파일 창에서 definitions/를 펼칩니다.
  3. 증분 테이블 정의 SQLX 파일 선택
  4. pre_operations 블록에서 BigQuery 스크립팅으로 변수를 선언합니다.
  5. 선언된 변수를 참조하는 WHERE 절이 있는 테이블을 정의하는 SELECT 문을 필터링합니다.
  6. (선택사항): 형식을 클릭합니다.

다음 코드 샘플은 참조된 raw_events 테이블이 event_timestamp로 파티션을 나눈 증분 테이블을 보여줍니다.

config {
  type: "incremental",
}

pre_operations {
  DECLARE event_timestamp_checkpoint DEFAULT (
    ${when(incremental(),
    `SELECT max(event_timestamp) FROM ${self()}`,
    `SELECT timestamp("2000-01-01")`)}
  )
}

SELECT
  *
FROM
  ${ref("raw_events")}
WHERE event_timestamp > event_timestamp_checkpoint

앞의 코드 샘플에서 event_timestamp_checkpoint 변수는 pre_operations 블록에 정의됩니다. 그런 다음 event_timestamp_checkpoint 변수가 WHERE 절에서 상수 표현식으로 사용됩니다.

전체 새로고침을 사용하여 증분 테이블을 처음부터 다시 빌드

--full-refresh 옵션으로 명령줄 인터페이스를 사용하거나 워크플로 실행을 트리거할 때 전체 새로고침으로 실행 옵션을 사용하여 증분 테이블을 강제로 처음부터 다시 빌드할 수 있습니다.

개발 작업공간에서 또는 Dataform CLI를 사용하여 전체 새로고침 옵션을 선택하면 Dataform이 실행 중에 ${when(incremental(), ... } 파라미터를 무시하고 CREATE OR REPLACE 문을 사용하여 테이블을 다시 만듭니다.

전체 새로고침으로부터 증분 테이블 보호

증분 테이블이 처음부터 다시 빌드되지 않도록 방지하고 데이터 손실을 방지하려면 증분 테이블을 protected로 설정하면 됩니다. 데이터 소스가 일시적인 경우 증분 테이블이 다시 빌드되지 않도록 해야 할 수 있습니다.

증분 테이블을 protected로 표시하려면 다음 단계를 따르세요.

  1. 개발 작업공간으로 이동합니다.
  2. 파일 창에서 definitions/를 펼칩니다.
  3. 증분 테이블 정의 SQLX 파일을 선택합니다.
  4. config 블록에 protected: true를 입력합니다.
  5. (선택사항): 형식을 클릭합니다.

다음 코드 샘플은 protected로 표시된 증분 테이블을 보여줍니다.

config {
  type: "incremental",
  protected: true
}
SELECT ...

다음 단계