AWS Athena에서 CTAS 및 dynamic partition insert 하기

원본 DB 테이블에서 데이터를 추스리거나 병합하여 새로운 테이블을 만드는 과정 중 많은 분들께서는 CTAS(Create Table as Select) 구문을 자주 사용하실텐데요.
AWS의 athena에서는 사용법이 조금 차이가 나 간략하게 기록해 봅니다.

일자 데이터인 dt로 파티션을 만드는 CTAS 구문 예는 아래와 같습니다.

CREATE table airguy_test.new_mart_table
WITH (
    format='PARQUET',
    parquet_compression='SNAPPY',
    partitioned_by=array['dt'],
    external_location = 's3://airguy-bucket/airguy_test/new_mart_table'
)
AS
SELECT 
    field1,
    field2,
    field3,
    dt
FROM
    airguy_test.old_dw_table

S3를 확인해 보면 dt별로 데이터가 잘 파티셔닝 되어있는 것을 확인할 수 있습니다.

하지만 생성해야 하는 파티션이 100개 이상일 경우 아래와 같은 에러 문구를 보실 수 있을 겁니다.

HIVE_TOO_MANY_OPEN_PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets

아쉽지만 다른 limitation과 틀리게 이 부분은 AWS에 요청을 해서 늘릴 수 있는 제약이 아닌 것 같습니다.
혹시 가능하다면 방법을 알려주시길 부탁드립니다. 🙂

저는 최근 1년 데이터(파티션 365개)를 만드려고 하다보니 100개씩 나눠서 수행하는 식으로 회피했습니다.

CREATE table airguy_test.new_mart_table
WITH (
    format='PARQUET',
    parquet_compression='SNAPPY',
    partitioned_by=array['dt'],
    external_location = 's3://airguy-bucket/airguy_test/new_mart_table'
)
AS
SELECT 
    field1,
    field2,
    field3,
    dt
FROM
    airguy_test.old_dw_table
WHERE
    dt >= '20210801' and dt < '20211101'

마지막 WHERE 절을 보시면 3달치만 초기 테이블 생성 시 insert 되도록 조치하여 쿼리 구동 시 오픈되는 파티션이 100개가 되지 않도록 조절했구요. 이후 dynamic partition insert로 나머지 일자를 채웠습니다.

INSERT INTO airguy_test.new_mart_table
SELECT 
    field1,
    field2,
    field3,
    dt
FROM
    airguy_test.old_dw_table
WHERE
    dt >= '20211101' and dt < '20220201'

참고로 hive 혹은 impala에서의 dynamic insert 구문은 다음과 같습니다.

INSERT INTO airguy_test.new_mart_table PARTITION(dt)
SELECT ~

과정이 조금 번거롭기는 하지만 DW 혹은 Mart 구축 초반에 이 문제를 직면하셨을 때 도움이 되길 바라며 글을 남겨봅니다.

감사합니다.