원본 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개 이상일 경우 아래와 같은 에러 문구를 보실 수 있을 겁니다.
아쉽지만 다른 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 구축 초반에 이 문제를 직면하셨을 때 도움이 되길 바라며 글을 남겨봅니다.
감사합니다.