증분 테이블 구성

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

증분 테이블 정보

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

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

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

다음은 증분 테이블의 몇 가지 일반적인 사용 사례입니다.

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

시작하기 전에

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

    Dataform 페이지로 이동

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

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

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

필요한 역할

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

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

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

각 실행 중에 Dataform이 처리할 행의 하위 집합을 확인하려면 조건부 WHERE 절을 증분 테이블 SQLX 정의 파일에 추가합니다. 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 ...

다음 단계