

# UNLOAD
<a name="unload"></a>

`SELECT` 문의 쿼리 결과를 지정된 데이터 형식으로 작성합니다. `UNLOAD`에 지원되는 형식에는 Apache Parquet, ORC, Apache Avro, JSON이 있습니다. CSV는 Athena `SELECT` 명령에서 지원하는 유일한 출력 형식이지만 다양한 출력 형식을 지원하는 `UNLOAD` 명령을 사용하여 `SELECT` 쿼리를 묶고 `UNLOAD`에서 지원하는 형식 중 하나로 출력을 다시 작성할 수 있습니다.

`CREATE TABLE AS`(CTAS) 문을 사용하여 CSV 외의 형식으로 데이터를 출력할 수 있지만 CTAS 문은 Athena에서 테이블을 만들어야 합니다. `UNLOAD` 문은 `SELECT` 쿼리의 결과를 CSV 외의 형식으로 출력할 때 유용하지만 관련된 테이블을 필요로 하지 않습니다. 예를 들어 어떤 다운스트림 애플리케이션은 `SELECT` 쿼리 결과가 JSON 형식이 되도록 요구할 수 있고, 추가적인 분석을 위해 `SELECT` 쿼리의 결과를 사용하려는 경우 Parquet 또는 ORC가 CSV에 대해 성능상 이점을 제공할 수 있습니다. 

## 고려 사항 및 제한 사항
<a name="unload-considerations-and-limitations"></a>

Athena에서 `UNLOAD` 문을 사용할 때는 다음 사항을 유의해야 합니다.
+ **파일의 전역 정렬 없음** – `UNLOAD` 결과는 여러 개의 파일에 병렬로 작성됩니다. `UNLOAD` 문의 `SELECT` 쿼리에 정렬 순서가 지정된 경우 각 파일의 내용은 순서대로 정렬되지만 파일들은 서로 간에 정렬되지 않습니다.
+ **분리된 데이터가 삭제되지 않음** - 실패 시 Athena는 분리된 데이터를 삭제하지 않습니다. 이 동작은 CTAS 및 `INSERT INTO` 문의 동작과 같습니다.
+ **최대 파티션** - `UNLOAD`에 사용할 수 있는 최대 파티션 수는 100개입니다.
+ **메타데이터 및 매니페스트 파일** - Athena는 각각의 `UNLOAD` 쿼리에 대해 메타데이터 파일 및 데이터 매니페스트 파일을 생성합니다. 매니페스트는 쿼리가 작성한 파일을 추적합니다. 두 파일은 모두 Amazon S3의 Athena 쿼리 결과 위치에 저장됩니다. 자세한 내용은 [쿼리 출력 파일 식별](querying-finding-output-files.md#querying-identifying-output-files) 단원을 참조하세요.
+ **암호화** – `UNLOAD` 출력 파일은 Amazon S3에 사용되는 암호화 구성에 따라 암호화됩니다. `UNLOAD` 결과를 암호화하도록 암호화 구성을 설정하려면 [EncryptionConfiguration API](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html)를 사용합니다.
+ **준비된 문** – `UNLOAD`는 준비된 문과 함께 사용할 수 있습니다. Athena의 준비된 문에 대한 자세한 내용은 [파라미터화된 쿼리 사용](querying-with-prepared-statements.md) 단원을 참조하세요.
+ **서비스 할당량** - `UNLOAD`는 DML 쿼리 할당량을 사용합니다. 할당량에 관한 자세한 내용은 [Service Quotas](service-limits.md) 단원을 참조하세요.
+ **예상 버킷 소유자** – 예상 버킷 소유자 설정은 `UNLOAD` 쿼리에 지정된 대상 Amazon S3 위치에 적용되지 않습니다. 예상 버킷 소유자 설정은 Athena 쿼리 결과에 대해 지정한 Amazon S3 출력 위치에만 적용됩니다. 자세한 내용은 [Athena 콘솔을 사용하여 쿼리 결과 위치 지정](query-results-specify-location-console.md) 섹션을 참조하세요.

## 구문
<a name="unload-syntax"></a>

`UNLOAD` 문은 다음 구문을 사용합니다.

```
UNLOAD (SELECT {{col_name}}[, ...] FROM {{old_table}}) 
TO 's3://amzn-s3-demo-bucket/{{my_folder}}/' 
WITH ( {{property_name}} = '{{expression}}' [, ...] )
```

파티션에 쓰는 경우를 제외하고, `TO` 대상에는 데이터가 없는 Amazon S3의 위치를 지정해야 합니다. `UNLOAD` 쿼리는 지정된 위치에 데이터를 쓰기 전에 버킷 위치가 비어 있는지 확인합니다. `UNLOAD`는 지정된 위치에 이미 데이터가 있는 경우 해당 위치에 데이터를 쓰지 않습니다. `UNLOAD`는 기존 데이터를 덮어쓰지 않습니다. 버킷 위치를 `UNLOAD`의 대상으로 재사용하려면 버킷 위치에서 데이터를 삭제한 다음 쿼리를 다시 실행합니다.

`UNLOAD`가 파티션에 쓸 때는 이 동작이 다르다는 점에 유의하세요. `SELECT` 문, `TO` 위치, 파티션이 동일한 같은 `UNLOAD` 쿼리를 여러 번 실행하는 경우 각 `UNLOAD` 쿼리는 지정된 위치와 파티션에 있는 Amazon S3로 데이터를 언로드합니다.

### 파라미터
<a name="unload-parameters"></a>

{{property\_name}}에 가능한 값은 다음과 같습니다.

** format = '{{file\_format}}'**  
필수 사항입니다. 출력의 파일 형식을 지정합니다. {{file\_format}}에 가능한 값은 `ORC`, `PARQUET`, `AVRO`, `JSON`, 또는 `TEXTFILE`입니다.

** compression = '{{compression\_format}}'**  
선택 사항. 이 옵션은 ORC 및 Parquet 형식에만 특정합니다. ORC은 기본값이 `zlib`이고, Parquet는 기본값이 `gzip`입니다. 지원되는 압축 형식에 대한 자세한 내용은 [Athena 압축 지원](https://docs.aws.amazon.com/athena/latest/ug/compression-formats.html)을 참조하세요.  
이 옵션은 `AVRO` 형식에 적용되지 않습니다. Athena는 `JSON` 및 `TEXTFILE` 형식에 `gzip`를 사용합니다.

**compression\_level = {{compression\_level}} **  
선택 사항. ZSTD 압축에 사용할 압축 수준입니다. 이 속성은 ZSTD 압축에만 적용됩니다. 자세한 내용은 [ZSTD 압축 수준 사용](compression-support-zstd-levels.md) 섹션을 참조하세요.

** field\_delimiter = '{{delimiter}}'**  
선택 사항. CSV, TSV 및 기타 텍스트 형식에 대해 단일 문자의 필드 구분 기호를 지정합니다. 다음은 쉼표를 구분 기호로 지정한 예입니다.  

```
WITH (field_delimiter = ',')
```
현재 여러 문자로 된 필드 구분 기호는 지원되지 않습니다. 필드 구분 기호를 지정하지 않으면 8진법 문자 `\001`(^A)이 사용됩니다.

** partitioned\_by = ARRAY[ {{col\_name}}[,...] ] **  
선택 사항. 출력을 분할하는 기준이 되는 열의 배열 목록입니다.  
`SELECT` 문에서 분할된 열의 이름이 문의 열 목록 마지막에 있는지 확인합니다.

## 예제
<a name="unload-examples"></a>

다음 예제는 `SELECT` 쿼리의 출력을 JSON 형식으로 Amazon S3 위치 `s3://amzn-s3-demo-bucket/unload_test_1/`에 작성합니다.

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/unload_test_1/' 
WITH (format = 'JSON')
```

다음 예제는 `SELECT` 쿼리의 출력을, Snappy 압축을 사용해 Parquet 형식으로 작성합니다.

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET',compression = 'SNAPPY')
```

다음 예제는 마지막 열을 기준으로 출력을 분할하여 네 개의 열을 텍스트 형식으로 작성합니다.

```
UNLOAD (SELECT name1, address1, comment1, key1 FROM table1) 
TO 's3://amzn-s3-demo-bucket/ partitioned/' 
WITH (format = 'TEXTFILE', partitioned_by = ARRAY['key1'])
```

다음 예제에서는 Parquet 파일 형식, ZSTD 압축 및 ZSTD 압축 수준 4를 사용하여 쿼리 결과를 지정된 위치로 언로드합니다.

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)
```

## 추가 리소스
<a name="unload-additional-resources"></a>
+ *AWS 빅 데이터 블로그*의 [Simplify your ETL and ML pipelines using the Amazon Athena UNLOAD feature](https://aws.amazon.com/blogs/big-data/simplify-your-etl-and-ml-pipelines-using-the-amazon-athena-unload-feature/).