

 Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.

# Amazon Redshift에서 데이터 언로드
<a name="c_unloading_data"></a>

데이터베이스 테이블에서 Amazon S3 버킷의 파일로 데이터를 언로드할 때는 SELECT 문에서 [UNLOAD](r_UNLOAD.md) 명령을 사용하면 됩니다. 텍스트 데이터는 로드할 때 사용한 데이터 형식에 상관없이 구분 형식 또는 고정 폭 형식으로 언로드할 수 있습니다. 또한 GZIP 압축 파일의 생성 여부도 지정할 수 있습니다.

Amazon S3 버킷에 대한 사용자의 액세스 권한은 임시 보안 자격 증명을 사용하여 제한할 수 있습니다.

**Topics**
+ [Amazon S3로 데이터 언로드](t_Unloading_tables.md)
+ [암호화된 데이터 파일 언로드](t_unloading_encrypted_files.md)
+ [구분 또는 고정 폭 형식의 데이터 언로드](t_unloading_fixed_width_data.md)
+ [언로드된 데이터 다시 로드](t_Reloading_unload_files.md)

# Amazon S3로 데이터 언로드
<a name="t_Unloading_tables"></a>

Amazon Redshift는 데이터를 병렬 방식으로 쉽게 다시 로드할 수 있도록 select 문의 결과를 다수의 파일, 즉 노드 조각당 1개 이상의 파일로 분할합니다. 또는 PARALLEL OFF 옵션을 추가하여 [UNLOAD](r_UNLOAD.md)가 결과를 1개 이상의 파일에 직렬 방식으로 작성하도록 지정할 수도 있습니다. Amazon S3의 파일 크기는 MAXFILESIZE 파라미터를 지정하여 제한할 수 있습니다. UNLOAD는 Amazon S3 서버 측 암호화(SSE-S3)를 사용하여 데이터 파일을 자동으로 암호화합니다.

Amazon Redshift에서 지원되는 UNLOAD 명령에서는 모든 select 문을 사용할 수 있습니다. 단, 바깥쪽 select에서 LIMIT 절을 사용하는 SELECT는 예외입니다. 예를 들어 특정 열을 추가하거나, 혹은 WHERE 절을 사용하여 다수의 테이블을 조인하는 SELECT 문을 사용할 수 있습니다. 쿼리에 인용 부호(리터럴 값을 묶는 등)가 포함되어 있으면 쿼리 텍스트에서 이스케이프 처리해야 합니다(\$1'). 자세한 내용은 [SELECT](r_SELECT_synopsis.md)&; Command Reference를 참조하세요. LIMIT 절의 사용에 대한 자세한 내용은 UNLOAD 명령의 [사용 노트](r_UNLOAD.md#unload-usage-notes) 섹션을 참조하세요.

예를 들어 다음 UNLOAD 명령은 VENUE 테이블의 내용을 Amazon S3 버킷인 `s3://amzn-s3-demo-bucket/tickit/unload/`로 전송합니다.

```
unload ('select * from venue')   
to 's3://amzn-s3-demo-bucket/tickit/unload/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

위 예에서 생성한 파일 이름에는 접두사 '`venue_`'가 추가됩니다.

```
venue_0000_part_00
venue_0001_part_00
venue_0002_part_00
venue_0003_part_00
```

기본적으로 UNLOAD는 클러스터의 조각 수에 따라 다수의 파일에 병렬 방식으로 데이터를 작성합니다. 데이터를 단일 파일에 작성할 때는 PARALLEL OFF를 지정하세요. 그러면 UNLOAD가 데이터를 직렬 방식으로 작성하여 절대적으로 ORDER BY 절(사용하는 경우)에 따라 정렬됩니다. 데이터 파일의 최대 크기는 6.2GB입니다. 데이터 크기가 최대 파일 크기보다 크면 UNLOAD가 각각 6.2GB까지 파일을 추가로 생성합니다.

다음은 VENUE의 내용을 단일 파일로 작성하는 예입니다. 파일 크기가 6.2GB보다 작기 때문에 파일이 하나만 필요합니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/tickit/unload/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
parallel off;
```

**참고**  
UNLOAD 명령은 병렬 처리를 사용하도록 설계되었습니다. 따라서 대부분 경우, 특히 COPY 명령에서 파일을 사용하여 테이블을 로드한다면 PARALLEL을 활성화하는 것이 좋습니다.

VENUE 테이블의 전체 데이터 크기가 5GB라고 가정했을 때 다음 예에서는 VENUE의 데이터를 각각 100MB씩 50개 파일로 작성합니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/tickit/unload/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
parallel off
maxfilesize 100 mb;
```

이때 접두사를 Amazon S3 경로 문자열에 추가하면 UNLOAD가 파일 이름에 접두사를 사용합니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/tickit/unload/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

UNLOAD 명령에서 MANIFEST 옵션을 지정하면 언로드 파일이 나열되는 매니페스트 파일을 생성할 수 있습니다. 매니페스트란 Amazon S3에 작성한 개별 파일의 URL을 명시적으로 나열한 JSON 형식의 텍스트 파일을 말합니다.

다음은 MANIFEST 옵션을 추가하는 예입니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/tickit/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

다음은 언로드 파일이 4개인 매니페스트 예입니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0000_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0001_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0002_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0003_part_00"}
  ]
}
```

COPY에서 MANIFEST 옵션을 지정하면 동일한 파일을 로드하는 데 매니페스트 파일을 사용할 수도 있습니다. 자세한 내용은 [매니페스트를 사용하여 데이터 파일 지정](loading-data-files-using-manifest.md) 섹션을 참조하세요.

UNLOAD 작업을 마치면 UNLOAD가 파일을 작성한 Amazon S3 버킷으로 이동하여 데이터가 정확하게 언로드되었는지 확인합니다. 조각마다 0부터 시작하여 번호가 매겨진 파일이 다수 표시됩니다. MANIFEST 옵션을 지정하였다면 여기에서 '`manifest`'로 끝나는 파일도 볼 수 있습니다. 예:

```
amzn-s3-demo-bucket/tickit/venue_0000_part_00 
amzn-s3-demo-bucket/tickit/venue_0001_part_00 
amzn-s3-demo-bucket/tickit/venue_0002_part_00 
amzn-s3-demo-bucket/tickit/venue_0003_part_00
amzn-s3-demo-bucket/tickit/venue_manifest
```

UNLOAD가 완료된 후 Amazon S3 목록 작업을 호출하여 Amazon S3에 기록된 파일 목록을 프로그래밍 방식으로 가져올 수 있습니다. STL\$1UNLOAD\$1LOG를 쿼리할 수도 있습니다.

다음은 UNLOAD에서 생성된 파일의 경로 이름을 반환하는 쿼리입니다. [PG\$1LAST\$1QUERY\$1ID](PG_LAST_QUERY_ID.md) 함수는 가장 최근 쿼리를 반환합니다.

```
select query, substring(path,0,40) as path
from stl_unload_log
where query=2320
order by path;

query |             path
-------+--------------------------------------
  2320 | s3://amzn-s3-demo-bucket/venue0000_part_00
  2320 | s3://amzn-s3-demo-bucket/venue0001_part_00
  2320 | s3://amzn-s3-demo-bucket/venue0002_part_00
  2320 | s3://amzn-s3-demo-bucket/venue0003_part_00
(4 rows)
```

데이터 용량이 너무 크면 Amazon Redshift가 각 조각마다 여러 부분으로 파일을 분할할 수도 있습니다. 예:

```
venue_0000_part_00
venue_0000_part_01
venue_0000_part_02
venue_0001_part_00
venue_0001_part_01
venue_0001_part_02
...
```

다음은 select 문에 인용 부호로 묶인 문자열이 포함되어 인용 부호가 이스케이프 처리(`=\'OH\' '`)되는 UNLOAD 명령입니다.

```
unload ('select venuename, venuecity from venue where venuestate=\'OH\' ')
to 's3://amzn-s3-demo-bucket/tickit/venue/ ' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

기본적으로 UNLOAD는 대상 버킷의 기존 파일을 덮어쓰지 않고 중단됩니다. 매니페스트 파일을 포함하여 기존 파일을 덮어쓰려면 ALLOWOVERWRITE 옵션을 지정합니다.

```
unload ('select * from venue') 
to 's3://amzn-s3-demo-bucket/venue_pipe_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest 
allowoverwrite;
```

# 암호화된 데이터 파일 언로드
<a name="t_unloading_encrypted_files"></a>

UNLOAD는 AWS 관리형 암호화 키를 사용하는 Amazon S3 서버 측 암호화(SSE-S3)를 통해 파일을 자동 생성합니다. AWS Key Management Service 키(SSE-KMS)를 사용하는 서버 측 암호화를 지정하거나 고객 관리형 키를 사용하는 클라이언트 측 암호화를 지정할 수도 있습니다. UNLOAD는 고객 제공 키를 사용하는 Amazon S3 서버 측 암호화는 지원하지 않습니다. 자세한 내용은 [서버 측 암호화를 사용하여 데이터 보호](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)를 참조하세요.

AWS KMS 키를 사용하는 서버 측 암호화를 통해 Amazon S3로 언로드하려면 다음 예와 같이 KMS\$1KEY\$1ID 파라미터를 지정하여 키 ID를 입력하세요.

```
unload ('select venuename, venuecity from venue')
to 's3://amzn-s3-demo-bucket/encrypted/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
KMS_KEY_ID '1234abcd-12ab-34cd-56ef-1234567890ab'
encrypted;
```

사용자 고유의 암호화 키를 입력하고 싶다면 UNLOAD 명령에서 ENCRYPTED 옵션을 사용하여 클라이언트 측에서 암호화된 데이터 파일을 Amazon S3에 생성할 수 있습니다. 그러면 UNLOAD가 Amazon S3 클라이언트 측 암호화에서 사용하는 것과 동일한 봉투 암호화 프로세스를 사용합니다. 그런 다음 COPY 명령에서 ENCRYPTED 옵션을 사용하여 암호화된 파일을 로드할 수 있습니다.

프로세스는 다음과 같습니다.

1. 프라이빗 암호화 키, 즉 *루트 대칭 키*로 사용할 base64 인코딩 256비트 AES 키를 생성합니다.

1. 루트 대칭 키와 ENCRYPTED 옵션을 추가하여 UNLOAD 명령을 실행합니다.

1. UNLOAD가 1회용 대칭키(*봉투 대칭 키*로도 불림)와 데이터 암호화에 사용되는 초기화 벡터(IV)를 생성합니다.

1. UNLOAD가 루트 대칭 키를 사용하여 봉투 대칭 키를 암호화합니다.

1. UNLOAD가 암호화된 데이터 파일을 Amazon S3에 저장하고, 각 파일과 함께 암호화된 봉투 키와 IV를 객체 메타데이터로 저장합니다. 암호화된 봉투 키는 객체 메타데이터 `x-amz-meta-x-amz-key`로 저장되고, IV는 객체 메타데이터 `x-amz-meta-x-amz-iv`로 저장됩니다.

봉투 암호화 프로세스에 대한 자세한 내용은 [Client-side data encryption with the AWS SDK for Java and Amazon S3](https://aws.amazon.com/articles/2850096021478074) 문서를 참조하세요.

암호화된 데이터 파일을 언로드하려면 루트 키 값을 자격 증명 문자열에 입력한 후 ENCRYPTED 옵션을 추가합니다. MANIFEST 옵션을 사용하면 매니페스트 파일도 암호화됩니다.

```
unload ('select venuename, venuecity from venue')
to 's3://amzn-s3-demo-bucket/encrypted/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key '<root_key>' 
manifest
encrypted;
```

암호화되면서 GZIP으로 압축된 데이터 파일을 언로드하려면 루트 키 값 및 ENCRYPTED 옵션과 함께 GZIP 옵션을 추가합니다.

```
unload ('select venuename, venuecity from venue')
to 's3://amzn-s3-demo-bucket/encrypted/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key '<root_key>' 
encrypted gzip;
```

암호화된 데이터 파일을 로드하려면 MASTER\$1SYMMETRIC\$1KEY 파라미터에 동일한 루트 키 값을 입력한 후 ENCRYPTED 옵션을 추가합니다.

```
copy venue from 's3://amzn-s3-demo-bucket/encrypted/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key '<root_key>' 
encrypted;
```

# 구분 또는 고정 폭 형식의 데이터 언로드
<a name="t_unloading_fixed_width_data"></a>

데이터를 구분 형식 또는 고정 폭 형식으로 언로드할 수 있습니다. 기본 출력은 파이프 구분('\$1' 문자 사용) 형식입니다.

다음은 쉼표를 구분자로 지정하는 예입니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/tickit/venue/comma' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter ',';
```

그 결과 출력되는 파일의 모습은 다음과 같습니다.

```
20,Air Canada Centre,Toronto,ON,0
60,Rexall Place,Edmonton,AB,0
100,U.S. Cellular Field,Chicago,IL,40615
200,Al Hirschfeld Theatre,New York City,NY,0
240,San Jose Repertory Theatre,San Jose,CA,0
300,Kennedy Center Opera House,Washington,DC,0
...
```

동일한 결과 집합을 탭으로 구분된 파일로 언로드하려면 다음과 같이 명령을 실행합니다.

```
unload ('select * from venue') 
to 's3://amzn-s3-demo-bucket/tickit/venue/tab' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter as '\t';
```

그 밖에 FIXEDWIDTH 명세를 사용할 수도 있습니다. 이 명세는 각 테이블 열의 식별자와 열의 폭(문자 수)으로 구성됩니다. UNLOAD 명령은 데이터를 자르기보다는 중단되기 때문에 폭을 지정할 때는 적어도 열에서 가장 긴 항목만큼 길어야 합니다. 고정 폭 데이터의 언로드는 구분 데이터의 언로드와 비슷하지만 결과적으로 구분 문자가 출력되지 않는다는 점이 다릅니다. 예: 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/tickit/venue/fw' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
fixedwidth '0:3,1:100,2:30,3:2,4:6';
```

예: 

```
20 Air Canada Centre         Toronto      ON0
60 Rexall Place              Edmonton     AB0
100U.S. Cellular Field       Chicago      IL40615
200Al Hirschfeld Theatre     New York CityNY0
240San Jose Repertory TheatreSan Jose     CA0
300Kennedy Center Opera HouseWashington   DC0
```

FIXEDWIDTH 명세에 대한 자세한 내용은 [UNLOAD](r_UNLOAD.md) 명령을 참조하세요.

# 언로드된 데이터 다시 로드
<a name="t_Reloading_unload_files"></a>

언로드 작업 결과를 다시 로드하려면 COPY 명령을 사용할 수 있습니다.

다음은 VENUE 테이블이 매니페스트 파일을 사용해 언로드된 후 길이가 잘려서 다시 로드되는 간단한 예입니다.

```
unload  ('select * from venue order by venueid')
to 's3://amzn-s3-demo-bucket/tickit/venue/reload_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
manifest 
delimiter '|';

truncate venue;

copy venue 
from 's3://amzn-s3-demo-bucket/tickit/venue/reload_manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest 
delimiter '|';
```

다시 로드된 VENUE 테이블의 모습은 다음과 같습니다.

```
select * from venue order by venueid limit 5;

 venueid |         venuename         |  venuecity  | venuestate | venueseats
---------+---------------------------+-------------+------------+-----------
       1 | Toyota Park               | Bridgeview  | IL         |          0
       2 | Columbus Crew Stadium     | Columbus    | OH         |          0
       3 | RFK Stadium               | Washington  | DC         |          0
       4 | CommunityAmerica Ballpark | Kansas City | KS         |          0
       5 | Gillette Stadium          | Foxborough  | MA         |      68756
(5 rows)
```