

# 데이터 파티셔닝
<a name="zero-etl-data-partitioning"></a>

## 데이터 파티셔닝이란 무엇인가요?
<a name="partitioning-overview"></a>

 데이터 파티셔닝은 대규모 데이터세트를 파티션이라고 하는 더 작고 관리하기 쉬운 세그먼트로 나누는 기법입니다. AWS Glue 제로 ETL 통합의 컨텍스트에서 파티셔닝은 특정 열 값 또는 해당 값의 변환을 기반으로 대상 위치에서 데이터를 구성합니다.

### 데이터 파티셔닝의 이점
<a name="partitioning-benefits"></a>

 효과적인 데이터 파티셔닝은 분석 워크로드에 몇 가지 주요 이점을 제공합니다.
+  **쿼리 성능 향상:** 쿼리는 관련 없는 파티션을 건너뛸 수 있으므로(파티션 정리) 스캔해야 하는 데이터의 양이 줄어듭니다.
+  **비용 절감:** 스캔하는 데이터가 줄어들면 분석 쿼리에 대한 컴퓨팅 및 I/O 비용을 절감할 수 있습니다.
+  **확장성 향상:** 파티셔닝을 통해 데이터 세그먼트를 병렬 처리할 수 있으므로 분석 워크로드를 더 효율적으로 확장할 수 있습니다.
+  **간소화된 데이터 수명 주기 관리:** 파티션 수준에서 보존 정책을 관리할 수 있으므로 이전 데이터를 더 간편하게 보관하거나 삭제할 수 있습니다.

### 주요 파티셔닝 개념
<a name="partitioning-concepts"></a>

파티션 열  
 레코드가 파티션으로 구성되는 방식을 결정하는 데 사용되는 데이터의 열입니다. 효과적인 파티션 열은 일반적인 쿼리 패턴과 일치해야 하며 적절한 카디널리티가 있어야 합니다.

파티션 함수  
 파티션 열 값에 변환을 적용하여 실제 파티션 경계를 생성합니다. 예를 들어 자격 증명(원시 값 사용), 시간 기반 함수(year, month, day, hour)가 있습니다.

파티션 정리  
 쿼리 엔진이 쿼리와 관련된 데이터가 포함되지 않은 파티션을 식별하고 건너뛰어 성능을 개선하는 프로세스입니다.

분할 영역 세분성  
 데이터가 파티셔닝되는 세부 수준입니다. 더 세밀한 세분화(파티션 수가 많을수록)는 쿼리 성능을 개선할 수 있지만 메타데이터 오버헤드가 증가할 수 있습니다. 덜 세밀한(파티션 수가 적을수록) 메타데이터 오버헤드는 줄어들지만 필요 이상으로 많은 데이터를 스캔하게 될 수 있습니다.

### AWS Glue 제로 ETL 통합의 파티셔닝
<a name="partitioning-in-zero-etl"></a>

 AWS Glue 제로 ETL 통합은 고급 파티셔닝 기능을 제공하는 Apache Iceberg 테이블 형식을 사용합니다. 제로 ETL 통합을 생성하면 다음을 수행할 수 있습니다.
+ 데이터 소스에 최적화된 기본 파티셔닝 전략 사용
+ 쿼리 패턴에 맞는 사용자 지정 파티셔닝 사양 정의
+ 파티션 열에 변환 적용(타임스탬프 기반 파티셔닝에 특히 유용)
+ 다중 수준 파티셔닝을 위한 여러 파티션 전략 결합

 파티셔닝 구성은 제로 ETL 통합을 설정할 때 `CreateIntegrationTableProperty` API를 통해 지정됩니다. 구성이 완료되면 AWS Glue는 이러한 파티셔닝 전략을 자동으로 적용하여 대상 위치에서 데이터를 구성합니다.

## 파티셔닝 사양 API 참조
<a name="partition-api-reference"></a>

CreateIntegrationTableProperties API에서 다음 파라미터를 사용하여 파티셔닝을 구성합니다.

PartitionSpec  
대상 위치에서 데이터를 파티셔닝하는 방법을 정의하는 파티션 사양의 배열입니다.  

```
{
  "partitionSpec": [
    {
      "fieldName": "timestamp_col",
      "functionSpec": "month",
      "conversionSpec": "epoch_milli"
    },
    {
      "fieldName": "category",
      "functionSpec": "identity"
    }
  ]
}
```

FieldName  
파티셔닝에 사용할 열 이름을 지정하는 UTF-8 문자열(1\~128바이트)입니다.

FunctionSpec  
파티셔닝 함수를 지정합니다. 유효한 값:  
+ `identity` - 변환 없이 소스 값을 직접 사용
+ `year` - 타임스탬프 값에서 연도 추출(예: 2023)
+ `month` - 타임스탬프 값에서 월 추출(예: 2023-01)
+ `day` - 타임스탬프 값에서 날짜 추출(예: 2023-01-15)
+ `hour` - 타임스탬프 값에서 시간 추출(예: 2023-01-15-14)
 시간 기반 함수(`year`, `month`, `day`, `hour`)는 소스 타임스탬프 형식을 지정하는 데 `ConversionSpec` 파라미터가 필요합니다.

ConversionSpec  
 소스 데이터의 타임스탬프 형식을 지정하는 UTF-8 문자열입니다. 유효값은 다음과 같습니다.  
+ `epoch_sec` - 초 단위의 Unix 에포크 타임스탬프
+ `epoch_milli` - 밀리초 단위의 Unix 에포크 타임스탬프
+ `iso` - ISO 8601 형식의 타임스탬프

## 파티셔닝 전략
<a name="partitioning-strategies"></a>

### 기본 파티셔닝
<a name="default-partitioning"></a>

 파티션 열을 지정하지 않으면 AWS Glue 제로 ETL은 데이터 소스에 최적화된 기본 파티셔닝 전략을 적용합니다.
+  **프라이머리 키 기반 파티셔닝:** 프라이머리 키가 있는 소스(예: DynamoDB 테이블)의 경우 AWS Glue 제로 ETL은 파티션 폭발을 방지하기 위해 버킷팅이 있는 프라이머리 키를 사용하여 데이터를 자동으로 파티셔닝합니다.

 기본 파티셔닝은 수동으로 구성할 필요 없이 일반적인 쿼리 패턴에 잘 작동하도록 설계되었습니다. 그러나 특정 쿼리 패턴 또는 성능 요구 사항의 경우 사용자 지정 파티셔닝 전략을 정의할 수 있습니다.

### 사용자 정의 파티셔닝 전략
<a name="user-defined-partitioning"></a>

 AWS Glue 제로 ETL을 사용하면 `PartitionSpec` 파라미터를 사용하여 사용자 지정 파티셔닝 전략을 정의할 수 있습니다. 하나 이상의 파티션 열을 지정하고 각 열에 서로 다른 파티셔닝 함수를 적용할 수 있습니다.

 **자격 증명 파티셔닝**은 열의 원시 값을 사용하여 파티션을 생성합니다. 이 전략은 범주, 리전 또는 상태 필드와 같이 카디널리티가 낮거나 중간 정도인 열에 유용합니다.

**Example 자격 증명 파티셔닝 예제**  

```
{
  "partitionSpec": [
    {
      "fieldName": "category",
      "functionSpec": "identity"
    }
  ]
}
```
 이렇게 하면 "category" 열의 각 고유 값에 대해 별도의 파티션이 생성됩니다.

**주의**  
 카디널리티가 높은 열(예: 프라이머리 키 또는 타임스탬프)에서 자격 증명 파티셔닝을 사용하면 파티션 폭발로 인해 성능이 저하되고 메타데이터 오버헤드가 증가할 수 있으므로 자격 증명 파티셔닝을 사용하지 마세요.

 **시간 기반 파티셔닝**은 다양한 세부 수준(연도, 월, 일 또는 시간)의 타임스탬프 값을 기반으로 데이터를 구성합니다. 이 전략은 시계열 데이터에 이상적이며 효율적인 시간 범위 쿼리를 지원합니다.

 시간 기반 파티셔닝을 사용하는 경우 AWS Glue 제로 ETL은 파티션 함수를 적용하기 전에 다양한 타임스탬프 형식을 표준화된 형식으로 자동 변환할 수 있습니다. 이 변환은 `ConversionSpec` 파라미터를 사용하여 지정됩니다.

**Example 시간 기반 파티셔닝 예제**  

```
{
  "partitionSpec": [
    {
      "fieldName": "created_at",
      "functionSpec": "month",
      "conversionSpec": "epoch_milli"
    }
  ]
}
```
 이렇게 하면 Unix 에포크 타임스탬프를 포함하는 "created\_at" 열을 기반으로 데이터를 월별로 파티셔닝합니다.

 AWS Glue 제로 ETL은 다음과 같은 시간 기반 파티션 함수를 지원합니다.
+  **연도:** 데이터를 연도별로 파티셔닝(예: 2023, 2024) 
+  **월:** 데이터를 월별로 파티셔닝(예: 2023-01, 2023-02) 
+  **일:** 데이터를 일별로 파티셔닝(예: 2023-01-01, 2023-01-02) 
+  **시간:** 데이터를 시간별로 파티셔닝(예: 2023-01-01-01, 2023-01-01-02) 

 AWS Glue 제로 ETL은 `ConversionSpec` 파라미터를 통해 다음과 같은 타임스탬프 형식을 지원합니다.
+  **epoch\_sec:** Unix 에포크 타임스탬프(초 단위) 
+  **epoch\_milli:** Unix 에포크 타임스탬프(밀리초 단위) 
+  **iso:** ISO 8601 형식의 타임스탬프 

**참고**  
 원본 열 값은 소스 데이터에서 변경되지 않습니다. AWS Glue는 대상 데이터베이스 테이블에서 파티션 열 값만 타임스탬프 유형으로 변환합니다. 변환은 파티셔닝 프로세스에만 적용됩니다.

 **다중 수준 파티셔닝**은 여러 파티션 전략을 결합하여 계층 기반 파티셔닝 체계를 생성합니다. 이는 동일한 데이터세트에 대해 서로 다른 유형의 쿼리를 최적화하는 데 유용합니다.

**Example 다중 수준 파티셔닝 예제**  

```
{
  "partitionSpec": [
    {
      "fieldName": "created_at",
      "functionSpec": "month",
      "conversionSpec": "iso"
    },
    {
      "fieldName": "region",
      "functionSpec": "identity"
    }
  ]
}
```
 이렇게 하면 먼저 월별로("created\_at" 열에서), 그리고 리전별로 2단계 파티셔닝 체계가 생성됩니다. 이를 통해 날짜 범위, 특정 리전, 또는 이러한 차원의 조합을 기준으로 필터링하는 효율적인 쿼리가 가능합니다.

 다중 수준 파티셔닝 체계를 설계할 때는 다음 사항을 고려하세요.
+  파티션 계층 구조에서 선택성이 높은 열을 먼저 배치 
+  파티션 세부 수준과 파티션 수 간 균형 맞추기 
+  파티셔닝 체계를 가장 일반적인 쿼리 패턴에 맞도록 조정 

## 모범 사례
<a name="best-practices"></a>

### 파티션 열 선택
<a name="best-practices-partition-column-selection"></a>
+  `identity` 파티션 함수에는 카디널리티가 높은 열을 사용하지 마세요. ID 파티셔닝과 함께 높은 카디널리티 열을 사용하면 작은 파티션이 많이 생성되어 수집 성능이 크게 저하될 수 있습니다. 카디널리티가 높은 열에는 다음이 포함될 수 있습니다.
  + 프라이머리 키
  + 타임스탬프 필드(예: `LastModifiedTimestamp`, `CreatedDate`)
  + 시스템 생성 타임스탬프
+  동일한 열에서 여러 타임스탬프 파티션을 선택하지 마세요. 예: 

  ```
  "partitionSpec": [
        {"fieldName": "col1", "functionSpec": "year", "conversionSpec" : "epoch_milli"},
        {"fieldName": "col1", "functionSpec": "month", "conversionSpec" : "epoch_milli"},
        {"fieldName": "col1", "functionSpec": "day", "conversionSpec" : "epoch_milli"},
        {"fieldName": "col1", "functionSpec": "hour", "conversionSpec" : "epoch_milli"}
  ]
  ```

### 파티션 FunctionSpec/ConversionSpec 선택
<a name="best-practices-partition-functionspec-conversionspec-selection"></a>
+  타임스탬프 기반 파티셔닝 함수를 사용할 때 타임스탬프 기반 파티셔닝에 대해 선택한 열 값의 형식을 나타내는 올바른 ConversionSpec(epoch\_sec \| epoch\_milli \| iso)을 지정합니다. AWS Glue 제로 ETL은 파티셔닝 전에 이 파라미터를 사용하여 소스 데이터를 타임스탬프 형식으로 올바르게 변환합니다.
+  데이터 볼륨에 따라 적절한 세분화(년/월/일/시간)를 사용합니다.
+  ISO 타임스탬프를 사용할 때 시간대 영향을 고려합니다. AWS Glue 제로 ETL은 선택한 타임스탬프 열의 모든 레코드 값을 UTC 시간대로 채웁니다.

## 오류 처리
<a name="error-handling"></a>

### NEEDS\_ATTENTION 상태
<a name="needs-attention-state"></a>

 다음과 같은 경우 통합이 NEEDS\_ATTENTION 상태가 됩니다.
+ 지정된 파티션 열이 소스에 없음
+ 파티션 열의 타임스탬프 변환 실패