증분 테이블 정보
Dataform은 테이블 유형에 따라 테이블을 다르게 업데이트합니다. 테이블 또는 뷰를 실행할 때마다 Dataform은 전체 테이블 또는 뷰를 처음부터 다시 빌드합니다.
증분 테이블을 정의하면 Dataform은 처음에만 증분 테이블을 처음부터 빌드합니다. 후속 실행 중에 Dataform은 구성한 조건에 따라 새 행만 증분 테이블에 삽입하거나 병합합니다.
Dataform은 이미 증분 테이블에 있는 열에만 새 행을 삽입합니다. 증분 열 정의 쿼리를 변경하는 경우(예: 새 열 추가) 테이블을 처음부터 다시 빌드해야 합니다. 이렇게 하려면 다음에 테이블 실행을 트리거할 때 전체 새로고침으로 실행 옵션을 선택합니다.
증분 테이블의 일반적인 사용 사례는 다음과 같습니다.
- 성능 최적화
- 웹 로그 또는 애널리틱스 데이터와 같은 일부 데이터의 경우 전체 테이블을 다시 처리하는 대신 새 레코드만 처리하는 것이 좋습니다.
- 지연 시간 감소
- 증분 테이블을 사용하여 워크플로를 자주 실행하지만 출력 테이블의 다운스트림 지연 시간을 줄일 수 있습니다.
- 일일 스냅샷
- 증분 테이블을 구성하여 테이블 데이터베이스에 대한 일일 스냅샷을 만들 수 있습니다. 예를 들어 프로덕션 데이터베이스에 저장된 사용자 설정의 종단적 분석을 수행할 수 있습니다.
시작하기 전에
Google Cloud 콘솔에서 Dataform 페이지로 이동합니다.
저장소를 선택하거나 만듭니다.
개발 작업공간을 선택하거나 만듭니다.
incremental
테이블 유형의 테이블을 만듭니다.
필요한 역할
증분 테이블을 구성하는 데 필요한 권한을 얻으려면 관리자에게 작업공간의 Dataform 편집자(roles/dataform.editor
) IAM 역할을 부여해 달라고 요청하세요.
역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
증분 테이블의 행 하위 집합 처리
각 실행 중에 Dataform에서 처리할 행의 하위 집합을 확인하려면 증분 테이블 SQLX 정의 파일에 조건부 WHERE
절을 추가합니다. WHERE
절에서 증분 조건과 비증분 조건을 지정할 수 있습니다.
Dataform은 테이블 실행 중에 전체 새로고침 없이 증분 조건을 적용하고, 전체 새로고침을 통해 실행 중에는 비증분 조건을 적용합니다.
증분 테이블을 구성하려면 다음 단계를 따르세요.
- 개발 작업공간으로 이동합니다.
- 파일 창에서
definitions/
를 펼칩니다. - 증분 테이블 정의 SQLX 파일을 엽니다.
다음 형식으로
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
절에 지정하는 조건
- SELECT_STATEMENT: 테이블을 정의하는
(선택사항): 형식을 클릭합니다.
다음 코드 샘플은 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
와 병합합니다.
증분 테이블에서 병합을 구성하려면 다음 단계를 따르세요.
- 개발 작업공간으로 이동합니다.
- 파일 창에서
definitions/
를 펼칩니다. - 증분 테이블 정의 SQLX 파일 선택
config
블록에서 선택한 열을 다음 형식으로uniqueKey
로 설정합니다.uniqueKey: ["COLUMN_NAME"]
COLUMN_NAME을 선택한 열 이름으로 바꿉니다.
(선택사항): 형식을 클릭합니다.
다음 코드 샘플은 항상 하나의 행을 포함하도록 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
를 설정합니다.
다음 코드 샘플은 uniqueKey
및 updatePartitionFilter
속성을 설정하여 병합이 구성된 파티션을 나눈 증분 테이블을 보여줍니다.
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은 전체 테이블을 스캔하지 않고 참조된 파티션을 나눈 테이블의 가장 최신 파티션을 기반으로 증분 테이블을 업데이트합니다.
파티션을 나눈 테이블을 참조하고 전체 테이블 스캔을 방지하는 증분 테이블을 구성하려면 다음 단계를 따르세요.
- 개발 작업공간으로 이동합니다.
- 파일 창에서
definitions/
를 펼칩니다. - 증분 테이블 정의 SQLX 파일 선택
pre_operations
블록에서 BigQuery 스크립팅으로 변수를 선언합니다.- 선언된 변수를 참조하는
WHERE
절이 있는 테이블을 정의하는SELECT
문을 필터링합니다. - (선택사항): 형식을 클릭합니다.
다음 코드 샘플은 참조된 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
로 표시하려면 다음 단계를 따르세요.
- 개발 작업공간으로 이동합니다.
- 파일 창에서
definitions/
를 펼칩니다. - 증분 테이블 정의 SQLX 파일을 선택합니다.
config
블록에protected: true
를 입력합니다.- (선택사항): 형식을 클릭합니다.
다음 코드 샘플은 protected
로 표시된 증분 테이블을 보여줍니다.
config {
type: "incremental",
protected: true
}
SELECT ...
다음 단계
- 테이블을 정의하는 방법은 테이블 만들기를 참조하세요.
- Dataform 명령줄 인터페이스를 사용하는 방법은 Dataform CLI 사용을 참조하세요.
- 실행을 수동으로 트리거하는 방법은 실행 트리거를 참조하세요.