ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 를 꼭 추가해야 합니다.

    댓글