파티셔닝이란 무엇인가요? - Amazon Athena

파티셔닝이란 무엇인가요?

파티셔닝이란 데이터의 특정 속성을 기반으로 Amazon S3의 디렉터리(또는 '접두사')로 데이터를 구성하는 작업을 의미합니다. 이러한 속성을 파티션 키라고 합니다. 일반적인 파티션 키는 날짜 또는 기타 시간 단위(예: 연도 또는 월)입니다. 하지만 데이터 세트는 둘 이상의 키로 파티셔닝할 수 있습니다. 예를 들어 제품 판매에 대한 데이터를 날짜, 제품 카테고리 및 마켓에 따라 파티셔닝할 수 있습니다.

파티셔닝 방법 결정

쿼리에 항상 또는 자주 사용되고 카디널리티가 낮은 속성이 파티션 키로 사용하기에 적합합니다. 파티셔닝이 너무 많은 경우와 너무 적은 경우 사이에는 상충 관계가 있습니다. 파티션이 너무 많으면 파일 수가 증가하여 오버헤드가 발생합니다. 파티션 자체를 필터링하는 데 약간의 오버헤드도 발생합니다. 파티션이 너무 적으면 쿼리에서 더 많은 데이터를 스캔해야 하기도 합니다.

분할된 테이블 생성

데이터 세트가 파티셔닝되면 Athena에서 파티셔닝된 테이블을 생성할 수 있습니다. 파티셔닝된 테이블은 파티션 키가 있는 테이블입니다. CREATE TABLE을 사용하는 경우 테이블에 파티션을 추가합니다. CREATE TABLE AS을 사용하는 경우 Amazon S3에 생성된 파티션이 테이블에 자동으로 추가됩니다.

CREATE TABLE 문에서 PARTITIONED BY (column_name data_type) 절에 파티션 키를 지정합니다. CREATE TABLE AS에서는 WITH (partitioned_by = ARRAY['partition_key']) 절에 파티션 키를 지정하거나 Iceberg 테이블의 경우 WITH (partitioning = ARRAY['partition_key']) 절에 지정합니다. 성능을 고려하여 파티션 키는 항상 STRING 유형이어야 합니다. 자세한 내용은 파티션 키의 데이터 형식으로 문자열 사용 단원을 참조하십시오.

추가적인 CREATE TABLECREATE TABLE AS 구문 세부 정보는 CREATE TABLECTAS 테이블 속성 섹션을 참조하세요.

분할된 테이블 쿼리

파티셔닝된 테이블을 쿼리하면 Athena는 쿼리에서 조건자를 사용하여 파티션 목록을 필터링합니다. 그런 다음 일치하는 파티션의 위치를 사용하여 찾은 파일을 처리합니다. Athena는 쿼리 조건자와 일치하지 않는 파티션의 데이터를 읽지 않음으로써 스캔하는 데이터의 양을 효율적으로 줄일 수 있습니다.

예시

sales_dateproduct_category를 기준으로 파티셔닝된 테이블이 있고 특정 카테고리에서 1주일 간의 총 수익을 알고자 합니다. Athena가 다음 예제와 같이 최소의 데이터만 스캔하도록 하기 위해 sales_dateproduct_category 열에 조건자를 포함합니다.

SELECT SUM(amount) AS total_revenue FROM sales WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' AND product_category = 'Toys'

데이터 세트가 날짜를 기준으로 파티셔닝되었지만 정밀한 타임스탬프도 있다고 가정합니다.

Iceberg 테이블을 사용하면 열과 관계를 설정하도록 파티션 키를 선언할 수 있지만, Hive 테이블을 사용하면 쿼리 엔진이 열과 파티션 키 간 관계를 인식하지 못합니다. 따라서 쿼리에서 필요한 것보다 많은 데이터를 스캔하지 않도록 하려면 쿼리에서 열과 파티션 키 모두에 조건자를 포함해야 합니다.

예를 들어 이전 예제의 sales 테이블에도 해당 TIMESTAMP 데이터 형식의 sold_at 열이 있다고 가정합니다. 특정 시간 범위의 매출만 원하는 경우 다음과 같이 쿼리를 작성합니다.

SELECT SUM(amount) AS total_revenue FROM sales WHERE sales_date = '2023-02-28' AND sold_at BETWEEN TIMESTAMP '2023-02-28 10:00:00' AND TIMESTAMP '2023-02-28 12:00:00' AND product_category = 'Toys'

Hive 테이블과 Iceberg 테이블 쿼리 사이의 이러한 차이에 대한 자세한 내용은 시간을 기준으로 파티셔닝된 타임스탬프 필드에 대한 쿼리를 작성하는 방법 섹션을 참조하세요.