-
[Airflow] BigQueryExecuteQueryOperator 파티션 테이블 생성공부/데이터 2022. 5. 4. 21:04
아래와 같이 데이터가 있다고 가정합니다.
select * from ( select date('2022-05-04') as dt, 1 as num union all select date('2022-05-04') as dt, 2 as num ) as t
위 쿼리 결과를 기준으로 dt를 day기준으로 파티션을 잡는다면 아래와 같이 진행할 수 있습니다.
BigQueryExecuteQueryOperator( task_id="task_id", sql="test.sql", use_legacy_sql=False, time_partitioning={'type': 'DAY', 'field': 'dt'}, destination_dataset_table='프로젝트.데이터셋.테이블', write_disposition=WriteDisposition.WRITE_TRUNCATE, )
여기서 2022-05-05날짜의 데이터가 추가되어 해당 dag를 실행한다면 2022-05-05날짜의 파티셔닝 테이블이 생성되는 것이 아닌 2022-05-04 데이터가 전부 삭제된 후, 2022-05-05 날짜의 데이터만 생성되게 됩니다.
즉, 서로 다른 파티션 키지만 이전의 데이터는 전부 삭제되고 새로운 결과로 테이블이 생성됩니다. 이를 방지하고자 한다면 아래와 같이
destination_dataset_table
값의 테이블 뒤에$yyyymmdd
처럼 주어야 합니다.- 일 기준
BigQueryExecuteQueryOperator( task_id="task_id", sql="test.sql", use_legacy_sql=False, time_partitioning={'type': 'DAY', 'field': 'dt'}, destination_dataset_table='프로젝트.데이터셋.테이블$20220505', write_disposition=WriteDisposition.WRITE_TRUNCATE, )
이렇게 해야만 20220504의 파티션은 건들지 않고 20220505 파티션 데이터만 지워지고 새로이 적재가 됩니다.
따라서 파티션 키는 지정했지만 task가 실행될 때마다 전체 테이블의 데이터 대상으로 갱신하고자 한다면
destination_dataset_table
옵션에$yyyymmdd
를 제거해야 하고 특정 날짜의 데이터만 새로 적재하고자 한다면$yyyymmdd
를 꼭 추가해야 합니다.