...
파티션 프로젝션 (Partition Projection)
Athena partitioned table 관련 공식 문서에선 MSCK REPAIR TABLE query로 partition을 인식하는 방법을 소개하는데, 이는 처음에만 자동으로 맵핑해주지, 그 이후에 추가된 로그 파일이나 폴더에 대해서는 따로 alter 작업을 해야 파티션 데이터가 업데이트가 된다.
따라서 추후에 추가된 로그 파일 경로를 자동으로 인식하게 하기 위해서는 따로 쉘 스크립트로 처리하거나 람다를 이용해야 되는데, 최근에 추가된 파티션 프로젝션 기능을 사용하면 이러한 과정을 완전 자동화 할수가 있다.
프로젝션 파티션은 간단히 말해, S3의 Key에 Placeholder를 사전에 구성해 테이블의 파티션을 생성하는 기능이다.
쿼리를 사용할 때 사전에 추가된 파티션 메타데이터에서 S3 파일을 찾아 읽는것이 아닌, Key의 Placeholder 부분에 해당하는 조건절을 구문 분석해 즉시 Key에 접근해 파일을 읽는다.
따라서 추후의 추가된 파일에 대한 파티션을 추가하는 행위나 Batch도 필요 없어지게 되는 것이다.
단, 프로젝트 파티션은 제약조건이 까다로운 편인데 공식 문서는 다음과 같이 제약에 대해서도 설명하고 있으니 숙지하여 사용할지 말지를 결정해야 한다.
프로젝션 파티션에 대한 고려 사항 & 제한 사항은 다음과 같다.
- 파티션 프로젝션을 사용하면 AWS Glue 또는 외부 Hive 메타스토어에서 수동으로 파티션을 지정할 필요가 없다.
- 테이블에서 파티션 프로젝션을 활성화하면 Athena는 AWS Glue 데이터 카탈로그 또는 해당 테이블에 대한 외부 Hive 메타스토어의 파티션 메타데이터를 무시한다.
- 파티션 프로젝션에 대해 정의된 범위 범위를 벗어난 값에 대한 쿼리는 오류를 반환하지 않는다. 대신 쿼리가 실행되지만 0개의 행을 반환한다.
예를 들어 2020년에 시작하고 로 정의된 시간 관련 데이터가 'projection.timestamp.range'='2020/01/01,NOW'있는 경우, SELECT * FROM table-name WHERE timestamp = '2019/02/02' 와 같은 쿼리 는 성공적으로 완료되지만 0개의 행을 반환한다. - 파티션 프로젝션은 Athena를 통해 테이블을 쿼리할 때만 사용할 수 있다.
- 파티션 프로젝션은 DML 전용 기능이므로 SHOW PARTITIONS Athena에서 프로젝션했지만 AWS Glue 카탈로그 또는 외부 Hive 메타스토어에 등록되지 않은 파티션을 나열하지 않는다.
파티션 프로젝션 실전 적용
백날 이론 글만 봐봤자, 100번 듣는 것보다 1번 직접 실행해보는 것이 100배 낫다. 곧바로 실전 적용에 들어가보자.
다음과 같이 년도별, 월별, 일자별로 세세히 디렉토리를 나눈 버킷 경로에 로그파일이 저장되어 있다고 가정한다. (예제에 쓰인 첨부파일을 업로드 해본다)
위의 버킷 경로 형식에 맞게 파티션 테이블을 생성해준다
PARTITIONED BY 를 통해 year, month, day 파티션 컬럼을 지정해주고, TBLPROPERTIES로 각 projection.year, projection.month, projection.day를 지정해 범위와 타입, 포맷을 설정해 준다.
마지막에는 storage.location.template으로 경로 형식을 지정해주면 된다.
각 프로젝션(projection)의 속성 의미에 대해선 다음 공식 문서를 참고하면 된다.
TBLPROPERTIES 란?
테이블에 사용자 지정 또는 미리 정의된 메타데이터 속성을 추가하고 할당된 값을 설정하는 프로퍼티 모음이다.
이에 대해선 다음 공식문서를 참고하길 바란다.
CREATE EXTERNAL TABLE IF NOT EXISTS test.mycsv_partition (
`time` STRING,
`user_id` STRING,
`board_name` STRING,
`action` STRING
)
PARTITIONED BY (year int, month int, day int) -- 파티셔닝 컬럼 지정
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
LOCATION 's3://athena-log-test-11/csvTest/'
TBLPROPERTIES (
'skip.header.line.count'='1', -- csv 의 첫번째 헤더행을 스킾
'projection.enabled'='true', -- 프로젝션 파티셔닝 사용
'projection.day.digits'='2', -- 일짜를 01, 02, 03 형식으로 사용
'projection.day.range'='01,31', -- 01일에서 31일 까지
'projection.day.type'='integer', -- int 타입
'projection.month.digits'='2', -- 월별을 01, 02, 03 형식으로 사용
'projection.month.range'='01,12', -- 01월에서 12월 까지
'projection.month.type'='integer', -- int 타입
'projection.year.digits'='4', -- 년도를 4글자로 사용
'projection.year.range'='2020,2022', -- 2020 ~ 2022 까지 스캔
'projection.year.type'='integer', -- int 타입
"storage.location.template" = "s3://athena-log-test-11/csvTest/${year}/${month}/${day}" -- 버킷 경로 형식
);
테이블을 만들었으면 조회해보자.
다음과 같이 year, month, day 파티션 필드가 추가됨을 확인 할 수 있다.
데이터 파티셔닝의 자동/수동 맵핑과의 차이점은 프로젝션 파티셔닝은 create문에 지정만하고 테이블 생성하자마자 바로 파티션 컬럼들이 등록됬다는 점이다. (자동/수동 맵핑할때는 MSCK나 ALTER문을 날려 파티셔닝을 업데이트 했었다)
그럼 정말로 자동화가 됬는지, 버킷에 폴더와 로그파일을 추가해보자. (04/ 폴더와 csv 파일을 안에 추가해본다)
그리고 다시 Athena에서 쿼리를 실행해보면, 따로 테이블 작업을 해주지 않았는데도 파티셔닝 컬럼이 자동으로 추가됨을 확인할 수 있다. (완전 자동화가 된 것이다 !)
이번엔 다른 버킷 경로 형식을 적용해보자.
년도, 월별, 일자 별이 아닌 다음과 같이 아예 날짜 별로 폴더를 만들어 로그 파일을 넣어 관리한다고 가정하자.
버킷 경로 형식에 맞는 프로젝션 파티션 테이블을 생성해 준다.
폴더가 하나니, PARTITIONED BY 를 통해 date 라는 파티션 컬럼을 지정해주었고, TBLPROPERTIES로 각 projection.date의 범위와 타입, 포맷을 설정해 준다.
마지막에는 storage.location.template으로 경로 형식을 지정해준다.
CREATE EXTERNAL TABLE IF NOT EXISTS test.mycsv_partition2 (
`time` STRING,
`user_id` STRING,
`board_name` STRING,
`action` STRING
)
PARTITIONED BY (date int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
LOCATION 's3://athena-log-test-11/csvTest2/'
TBLPROPERTIES (
'skip.header.line.count'='1',
'projection.enabled'='true',
'projection.date.format'='yyyyMMdd',
'projection.date.interval'='1',
'projection.date.interval.unit'='DAYS',
'projection.date.range'='20190101,20240101',
'projection.date.type'='date',
"storage.location.template" = "s3://athena-log-test-11/csvTest2/${date}"
);
테이블을 조회해보면, 다음과 같이 date 파티션 필드가 생성되고 자동으로 날짜별로 잘 분류가 됨을 확인 할 수 있다.
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.