

 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/)을 참조하세요.

# COPY
<a name="r_COPY"></a>


|  | 
| --- |
| 2025년 4월 30일부터 신규 고객에게 COPY 및 UNLOAD 명령에 대한 클라이언트 측 암호화가 더 이상 제공되지 않습니다. 2025년 4월 30일 이전 12개월 동안 COPY 및 UNLOAD 명령에 클라이언트 측 암호화를 사용한 경우, 2026년 4월 30일까지 COPY 또는 UNLOAD 명령에 클라이언트 측 암호화를 계속 사용할 수 있습니다. 2026년 4월 30일 이후에는 COPY 및 UNLOAD에 클라이언트 측 암호화를 사용할 수 없습니다. 가능한 한 빨리 COPY 및 UNLOAD에 서버 측 암호화를 사용하도록 전환하는 것이 좋습니다. 이미 COPY 및 UNLOAD에 서버 측 암호화를 사용하고 있는 경우 변경 사항이 없으며 쿼리를 변경하지 않고도 계속 사용할 수 있습니다. COPY 및 UNLOAD 암호화에 대한 자세한 내용은 아래 ENCRYPTED 파라미터를 참조하세요.   | 

데이터 파일 또는 Amazon DynamoDB 테이블의 데이터를 테이블에 로드합니다. 이 파일은 Amazon Simple Storage Service(Amazon S3) 버킷과 Amazon EMR 클러스터 또는 SSH(Secure Shell) 연결을 사용하여 액세스하는 원격 호스트에서 찾을 수 있습니다.

**참고**  
Amazon Redshift Spectrum 외부 테이블은 읽기 전용입니다. 외부 테이블로 복사할 수 없습니다.

COPY 명령은 입력 데이터를 테이블에 추가 행으로 추가합니다.

어떤 원본이든지 상관없이 단일 입력 행의 최대 크기는 4MB입니다.

**Topics**
+ [필수 권한](#r_COPY-permissions)
+ [COPY 구문](#r_COPY-syntax)
+ [필수 파라미터](#r_COPY-syntax-required-parameters)
+ [선택적 파라미터](#r_COPY-syntax-overview-optional-parameters)
+ [COPY 명령에 대한 사용 참고 사항 및 추가 리소스](#r_COPY-using-the-copy-command)
+ [COPY 명령 예시](#r_COPY-using-the-copy-command-examples)
+ [COPY JOB](r_COPY-JOB.md)
+ [템플릿으로 복사](r_COPY-WITH-TEMPLATE.md)
+ [COPY 파라미터 참조](r_COPY-parameters.md)
+ [사용 노트](r_COPY_usage_notes.md)
+ [COPY 예](r_COPY_command_examples.md)

## 필수 권한
<a name="r_COPY-permissions"></a>

COPY 명령을 사용하려면 Amazon Redshift 테이블에 대한 [INSERT](r_GRANT.md#grant-insert) 권한이 필요합니다.

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

```
COPY table-name 
[ column-list ]
FROM data_source
authorization
[ [ FORMAT ] [ AS ] data_format ] 
[ parameter [ argument ] [, ... ] ]
```

COPY 작업은 테이블 이름과 데이터 원본, 그리고 데이터에 대한 액세스 권한 등 최소 3개 파라미터만 있으면 실행할 수 있습니다.

Amazon Redshift는 COPY 명령의 기능을 연장하여 다수의 데이터 원본에서 몇 가지 데이터 형식으로 데이터를 로드하거나, 데이터 로드를 위한 액세스 권한을 제어하거나, 데이터 변환 및 로드 작업을 관리하는 데도 사용 가능합니다.

이번 섹션에서는 필요한 COPY 명령 파라미터를 제시하면서 함수에 따라 옵션 파라미터를 분류합니다. 각 파라미터와 함께 다양한 옵션 조합의 사용 방법에 대해서도 설명합니다. 알파벳 순서로 정렬된 파라미터 목록을 사용해 파라미터 설명으로 직접 이동할 수 있습니다.

## 필수 파라미터
<a name="r_COPY-syntax-required-parameters"></a>

COPY 명령에는 세 가지 파라미터가 필요합니다.
+ [Table Name](#r_COPY-syntax-overview-table-name)
+ [Data Source](#r_COPY-syntax-overview-data-source)
+ [Authorization](#r_COPY-syntax-overview-credentials)

COPY 명령을 가장 단순하게 사용하면 다음 형식과 같습니다.

```
COPY table-name 
FROM data-source
authorization;
```

다음은 CATDEMO라는 이름의 테이블을 생성한 다음 `category_pipe.txt`라는 이름의 Amazon S3 데이터 파일에서 샘플 데이터를 테이블에 로드하는 예입니다.

```
create table catdemo(catid smallint, catgroup varchar(10), catname varchar(10), catdesc varchar(50));
```

다음 예에서 COPY 명령의 데이터 원본은 이름이 `redshift-downloads`인 Amazon S3 버킷의 `tickit` 폴더에 저장된 `category_pipe.txt`라는 데이터 파일입니다. COPY 명령은 AWS Identity and Access Management(IAM) 역할을 통해 Amazon S3 버킷에 액세스할 수 있는 권한이 부여됩니다. 클러스터에 연결되어 있는 기존 IAM 역할에 Amazon S3에 액세스할 수 있는 권한이 부여되어 있으면 다음 COPY 명령에서 해당 역할의 Amazon 리소스 이름(ARN)으로 치환한 후 명령을 실행할 수 있습니다.

```
copy catdemo
from 's3://redshift-downloads/tickit/category_pipe.txt'
iam_role 'arn:aws:iam::<aws-account-id>:role/<role-name>'
region 'us-east-1';
```

다른 AWS 리전에서 데이터를 로드하기 위한 지침을 포함하여 COPY 명령으로 샘플 데이터를 로드하는 방법에 대한 전체 지침은 Amazon Redshift 시작 안내서의 [Amazon S3에서 샘플 데이터 로드](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html)를 참조하세요.

*table-name*  <a name="r_COPY-syntax-overview-table-name"></a>
COPY 명령을 실행할 대상 테이블의 이름입니다. 이 테이블은 사전에 데이터베이스에 존재해야 하며, 임시 테이블일 수도 있고, 영구 테이블일 수도 있습니다. COPY 명령은 새로운 입력 데이터를 테이블의 기존 행에 추가합니다.

FROM *data-source*  <a name="r_COPY-syntax-overview-data-source"></a>
대상 테이블에 로드할 원본 테이블의 위치입니다. 일부 데이터 소스로 매니페스트 파일을 지정할 수 있습니다.  
가장 공통적으로 사용되는 데이터 리포지토리는 Amazon S3 버킷입니다. 또한 클러스터가 Amazon EMR 클러스터와 Amazon EC2 인스턴스, 또는 SSH 연결을 사용하여 액세스할 수 있는 원격 호스트에 위치한 데이터 파일에서 데이터를 로드하거나, 혹은 DynamoDB 테이블에서 직접 데이터를 로드할 수도 있습니다.  
+ [Amazon S3에서 COPY](copy-parameters-data-source-s3.md)
+ [Amazon EMR에서 COPY](copy-parameters-data-source-emr.md) 
+ [원격 호스트(SSH)에서 COPY 지원](copy-parameters-data-source-ssh.md)
+ [Amazon DynamoDB에서 COPY](copy-parameters-data-source-dynamodb.md)

승인  <a name="r_COPY-syntax-overview-credentials"></a>
클러스터가 다른 AWS 리소스에 액세스하기 위한 인증 및 권한 부여에 사용할 방법을 나타내는 절입니다. COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 이러한 권한은 클러스터에 연결되어 있는 IAM 역할을 참조하거나, 혹은 IAM 사용자의 액세스 키 ID와 보안 액세스 키를 입력하면 부여할 수 있습니다.  
+ [권한 부여 파라미터](copy-parameters-authorization.md) 
+ [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 
+ [키 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based) 

## 선택적 파라미터
<a name="r_COPY-syntax-overview-optional-parameters"></a>

또는 COPY에서 필드 데이터를 대상 테이블의 열에 매핑하는 방식을 지정하고, COPY 명령에서 원본 데이터를 제대로 읽고 구문 분석하도록 원본 데이터 속성을 정의하고, 로드 프로세스 중 COPY 명령으로 수행하는 작업을 관리할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](#r_COPY-syntax-overview-data-format)
+ [데이터 변환 파라미터](#r_COPY-syntax-overview-data-conversion)
+ [데이터 로드 작업](#r_COPY-syntax-overview-data-load)

### 열 매핑
<a name="r_COPY-syntax-overview-column-mapping"></a>

기본적으로 COPY 명령은 데이터 파일의 필드 순서와 동일하게 필드 값을 대상 테이블의 열에 삽입합니다. 기본 열 순서가 유효하지 않은 경우에는 열 목록을 지정하거나 JSONPath 표현식을 사용하여 원본 데이터 필드를 대상 열로 매핑할 수 있습니다.
+ [Column List](copy-parameters-column-mapping.md#copy-column-list)
+ [JSONPaths File](copy-parameters-column-mapping.md#copy-column-mapping-jsonpaths)

### 데이터 형식 파라미터
<a name="r_COPY-syntax-overview-data-format"></a>

데이터는 텍스트 파일에서 고정 폭, 문자 구분, 쉼표 구분 값(CSV) 또는 JSON 형식으로, 혹은 Avro 파일에서 로드할 수 있습니다.

COPY 명령에서는 기본적으로 원본 데이터가 문자로 구분된 UTF-8 텍스트 파일 형식입니다. 기본 구분자는 파이프 문자(\$1)입니다. 원본 데이터가 다른 형식인 경우에는 다른 파라미터를 사용하여 데이터 형식을 지정합니다.
+ [FORMAT](copy-parameters-data-format.md#copy-format)
+ [CSV](copy-parameters-data-format.md#copy-csv)
+ [DELIMITER](copy-parameters-data-format.md#copy-delimiter) 
+ [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth) 
+ [SHAPEFILE](copy-parameters-data-format.md#copy-shapefile) 
+ [AVRO](copy-parameters-data-format.md#copy-avro) 
+ [JSON format for COPY](copy-parameters-data-format.md#copy-json) 
+ [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 
+ [BZIP2](copy-parameters-file-compression.md#copy-bzip2) 
+ [GZIP](copy-parameters-file-compression.md#copy-gzip) 
+ [LZOP](copy-parameters-file-compression.md#copy-lzop) 
+ [PARQUET](copy-parameters-data-format.md#copy-parquet) 
+ [ORC](copy-parameters-data-format.md#copy-orc) 
+ [ZSTD](copy-parameters-file-compression.md#copy-zstd) 

### 데이터 변환 파라미터
<a name="r_COPY-syntax-overview-data-conversion"></a>

COPY 명령은 테이블에 데이터를 로드할 때 원본 데이터의 문자열을 묵시적으로 대상 열의 데이터 형식으로 변환합니다. 기본 동작과 다른 변환을 지정해야 하거나, 혹은 기본 변환이 오류를 일으킬 때는 다음 파라미터를 지정하여 데이터 변환을 관리할 수 있습니다.
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate) 
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars) 
+ [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull) 
+ [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat) 
+ [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull) 
+ [ENCODING](copy-parameters-data-conversion.md#copy-encoding) 
+ [ESCAPE](copy-parameters-data-conversion.md#copy-escape) 
+ [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids) 
+ [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord) 
+ [IGNOREBLANKLINES](copy-parameters-data-conversion.md#copy-ignoreblanklines) 
+ [IGNOREHEADER](copy-parameters-data-conversion.md#copy-ignoreheader) 
+ [NULL AS](copy-parameters-data-conversion.md#copy-null-as) 
+ [REMOVEQUOTES](copy-parameters-data-conversion.md#copy-removequotes) 
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 
+ [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat) 
+ [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks) 
+ [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns) 

### 데이터 로드 작업
<a name="r_COPY-syntax-overview-data-load"></a>

문제 해결을 위해, 혹은 로드 시간을 줄일 목적으로 다음 파라미터를 지정하여 로드 작업의 기본 동작을 관리합니다.
+ [COMPROWS](copy-parameters-data-load.md#copy-comprows) 
+ [COMPUPDATE](copy-parameters-data-load.md#copy-compupdate) 
+ [IGNOREALLERRORS](copy-parameters-data-load.md#copy-ignoreallerrors) 
+ [MAXERROR](copy-parameters-data-load.md#copy-maxerror) 
+ [NOLOAD](copy-parameters-data-load.md#copy-noload) 
+ [STATUPDATE](copy-parameters-data-load.md#copy-statupdate) 

## COPY 명령에 대한 사용 참고 사항 및 추가 리소스
<a name="r_COPY-using-the-copy-command"></a>

COPY 명령의 사용 방법에 대한 자세한 내용은 아래 주제를 참조하세요.
+ [사용 노트](r_COPY_usage_notes.md)
+ [튜토리얼: Amazon S3에서 데이터 로드](tutorial-loading-data.md)
+ [데이터 로드에 대한 Amazon Redshift 모범 사례](c_loading-data-best-practices.md)
+ [COPY 명령으로 테이블 로드](t_Loading_tables_with_the_COPY_command.md)
  + [Amazon S3에서 데이터 로드](t_Loading-data-from-S3.md)
  + [Amazon EMR에서 데이터 로드](loading-data-from-emr.md)
  + [원격 호스트에서 데이터 로드](loading-data-from-remote-hosts.md) 
  + [Amazon DynamoDB 테이블에서 데이터 로드](t_Loading-data-from-dynamodb.md)
+ [데이터 로드 문제 해결](t_Troubleshooting_load_errors.md)

## COPY 명령 예시
<a name="r_COPY-using-the-copy-command-examples"></a>

다양한 소스에서 다양한 형식으로 다양한 COPY 옵션을 사용하여 COPY를 실행하는 방법을 보여주는 추가 예시는 [COPY 예](r_COPY_command_examples.md) 섹션을 참조하세요.

# COPY JOB
<a name="r_COPY-JOB"></a>

이 명령 사용에 대한 자세한 내용은 [Amazon S3 버킷에서 자동으로 파일을 복사하기 위해 S3 이벤트 통합 만들기](loading-data-copy-job.md) 섹션을 참조하세요.

데이터를 테이블로 로드하는 COPY 명령을 관리합니다. COPY JOB 명령은 COPY 명령의 확장이며 Amazon S3 버킷에서 데이터 로드를 자동화합니다. COPY 작업을 생성하면 Amazon Redshift는 지정된 경로에 새 Amazon S3 파일이 생성되는 시기를 감지한 다음 사용자 개입 없이 자동으로 로드합니다. 원래 COPY 명령에 사용된 것과 동일한 파라미터가 데이터를 로드할 때 사용됩니다. Amazon Redshift는 파일 이름을 기반으로 로드된 파일을 추적하여 한 번만 로드되었는지 확인합니다.

**참고**  
사용법, 파라미 및 권한을 비롯한 COPY 명령에 대한 자세한 내용은 [COPY](r_COPY.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_COPY-JOB-privileges"></a>

COPY JOB 명령을 사용하려면 COPY를 사용하는 데 필요한 모든 권한 외에도 다음 권한 중 하나가 있어야 합니다.
+ 수퍼유저
+  다음 모두: 
  +  COPY 대상 데이터베이스의 COPY JOBS에 대한 관련 CREATE, ALTER 또는 DROP 범위 지정 권한.
  +  COPY 대상 스키마에 대한 USAGE 권한 또는 COPY 대상 데이터베이스의 스키마에 대한 USAGE 범위 지정 권한.
  +  COPY 대상 테이블에 대한 INSERT 권한 또는 COPY 대상 스키마 또는 데이터베이스의 테이블에 대한 INSERT 범위 지정 권한.

COPY 명령으로 지정된 IAM 역할에는 로드할 데이터에 액세스할 수 있는 권한이 있어야 합니다. 자세한 내용은 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions) 섹션을 참조하세요.

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

COPY 작업을 생성합니다. COPY 명령의 파라미터는 COPY 작업과 함께 저장됩니다.

트랜잭션 블록의 범위 내에서 COPY JOB CREATE를 실행할 수 없습니다.

```
COPY copy-command JOB CREATE job-name
[AUTO ON | OFF]
```

COPY 작업의 구성을 변경합니다.

```
COPY JOB ALTER job-name
[AUTO ON | OFF]
```

COPY 작업을 실행합니다. 저장된 COPY 명령 파라미터가 사용됩니다.

```
COPY JOB RUN job-name
```

모든 COPY 작업을 나열합니다.

```
COPY JOB LIST
```

COPY 작업의 세부 정보를 표시합니다.

```
COPY JOB SHOW job-name
```

COPY 작업을 삭제합니다.

트랜잭션 블록 범위 내에서 COPY JOB DROP을 실행할 수 없습니다.

```
COPY JOB DROP job-name
```

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

*copy-command*  
Amazon S3에서 Amazon Redshift로 데이터를 로드하는 COPY 명령입니다. 이 절에는 데이터를 로드할 때 사용되는 Amazon S3 버킷, 대상 테이블, IAM 역할 및 기타 파라미터를 정의하는 COPY 파라미터가 포함되어 있습니다. Amazon S3 데이터 로드에 대한 모든 COPY 명령 파라미터는 다음을 제외하고 지원됩니다.  
+ COPY JOB은 COPY 명령이 가리키는 폴더에 있는 기존 파일을 수집하지 않습니다. COPY JOB 생성 타임스탬프 이후에 생성된 파일만 수집합니다.
+ MAXERROR 또는 IGNOREALLERRORS 옵션과 함께 COPY 명령을 지정할 수 없습니다.
+ 매니페스트 파일을 지정할 수 없습니다. COPY JOB에는 새로 생성된 파일을 모니터링하기 위해 지정된 Amazon S3 위치가 필요합니다.
+ 액세스 및 비밀 키와 같은 인증 유형으로 COPY 명령을 지정할 수 없습니다. 권한 부여에 `IAM_ROLE` 파라미터를 사용하는 COPY 명령만 지원됩니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.
+ COPY JOB은 클러스터와 연결된 기본 IAM 역할을 지원하지 않습니다. COPY 명령에서 `IAM_ROLE`을 지정해야 합니다.
자세한 내용은 [Amazon S3에서 COPY](copy-parameters-data-source-s3.md) 섹션을 참조하세요.

*job-name*  
COPY 작업을 참조하는 데 사용되는 작업의 이름입니다. *job-name*에는 하이픈(‐)을 사용할 수 없습니다.

 [AUTO ON \$1 OFF]   
Amazon S3 데이터가 Amazon Redshift 테이블에 자동으로 로드되는지 여부를 나타내는 절입니다.  
+ `ON`일 때 Amazon Redshift는 새로 생성된 파일의 소스 Amazon S3 경로를 모니터링하고, 파일이 발견되면 작업 정의의 COPY 파라미터와 함께 COPY 명령이 실행됩니다. 이 값이 기본값입니다.
+ `OFF`일 때 Amazon Redshift는 COPY JOB을 자동으로 실행하지 않습니다.

## 사용 노트
<a name="r_COPY-JOB-usage-notes"></a>

COPY 명령의 옵션은 런타임까지 유효성이 검사되지 않습니다. 예를 들어 잘못된 `IAM_ROLE` 또는 Amazon S3 데이터 소스로 인해 COPY JOB이 시작될 때 런타임 오류가 발생합니다.

클러스터가 일시 중지된 경우 COPY JOBS는 실행되지 않습니다.

로드된 COPY 명령 파일을 쿼리하고 오류를 로드하려면 [STL\$1LOAD\$1COMMITS](r_STL_LOAD_COMMITS.md), [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md), [STL\$1LOADERROR\$1DETAIL](r_STL_LOADERROR_DETAIL.md) 섹션을 참조하세요. 자세한 내용은 [데이터가 올바로 로드되었는지 확인](verifying-that-data-loaded-correctly.md) 섹션을 참조하세요.

COPY JOBS는 읽기 전용 모드에서 작동하므로 제로 ETL 데이터베이스에서는 지원되지 않습니다.

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

다음 예에서는 Amazon S3 버킷에서 데이터를 로드하기 위해 COPY 작업을 생성하는 방법을 보여줍니다.

```
COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName' 
JOB CREATE my_copy_job_name
AUTO ON;
```

# 템플릿으로 복사
<a name="r_COPY-WITH-TEMPLATE"></a>

Redshift 템플릿을 COPY 명령과 함께 사용하여 명령 구문을 단순화하고 데이터 로드 작업 전반에서 일관성을 보장할 수 있습니다. 동일한 형식 지정 파라미터를 반복적으로 지정하는 대신 템플릿에서 한 번 정의하고 COPY 명령에서 템플릿을 참조합니다. 템플릿을 사용하는 경우 COPY 명령은 템플릿의 파라미터를 명령에 직접 지정된 모든 파라미터와 결합합니다. 템플릿과 명령 모두에 동일한 파라미터가 나타나면 명령 파라미터가 우선합니다. 자세한 내용은 [CREATE TEMPLATE](r_CREATE_TEMPLATE.md) 섹션을 참조하세요.

COPY 명령의 템플릿은 다음을 사용하여 생성할 수 있습니다.
+ [데이터 형식 파라미터](copy-parameters-data-format.md)
+ [파일 압축 파라미터](copy-parameters-file-compression.md)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)

지원되는 파라미터의 전체 목록은 [COPY](r_COPY.md) 명령을 참조하세요.

## 필수 권한
<a name="r_COPY-WITH-TEMPLATE-privileges"></a>

COPY 명령에서 템플릿을 사용하려면 다음이 필요합니다.
+ COPY 명령을 실행하는 데 필요한 모든 권한([필수 권한](r_COPY.md#r_COPY-permissions) 참조)
+ 다음 템플릿 권한 중 하나입니다.
  + 수퍼유저 권한
  + 템플릿에 대한 USAGE 권한 및 템플릿이 포함된 스키마에 대한 USAGE 권한

## 구문
<a name="r_COPY-WITH-TEMPLATE-syntax"></a>

```
COPY target_table FROM 's3://...'
authorization
[ option, ...]
USING TEMPLATE [database_name.][schema_name.]template_name;
```

## 파라미터
<a name="r_COPY-WITH-TEMPLATE-parameters"></a>

 *database\$1name*   
(선택 사항) 템플릿이 있는 데이터베이스의 이름입니다. 지정하지 않으면 현재 데이터베이스가 사용됩니다.

 *schema\$1name*   
(선택 사항) 템플릿이 있는 스키마의 이름입니다. 지정하지 않으면 현재 검색 경로에서 템플릿이 검색됩니다.

 *template\$1name*   
COPY에서 사용할 템플릿 이름입니다.

## 사용 노트
<a name="r_COPY-WITH_TEMPLATE-usage-notes"></a>
+ COPY 명령에서 명령별 파라미터(소스, 대상, 권한 부여)를 계속 지정해야 합니다.
+ 템플릿에는 COPY 명령에 대한 매니페스트 파일 사양이 포함될 수 없습니다.

## 예제
<a name="r_COPY-WITH-TEMPLATE-examples"></a>

다음 예제에서는 템플릿을 생성하고 COPY 명령에서 사용하는 방법을 보여 줍니다.

```
CREATE TEMPLATE public.test_template FOR COPY AS
CSV DELIMITER '|' IGNOREHEADER 1 MAXERROR 100;

COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName'
USING TEMPLATE public.test_template;
```

템플릿과 명령 모두에 파라미터가 있는 경우 명령 파라미터가 우선합니다. 이 예제에서는 `public.test_template` 템플릿에 `DELIMITER '|'` 기호가 포함되어 있지만 COPY 명령이 `DELIMITER ','` 기호를 지정하는 경우 명령의 쉼표 구분 기호(`,`)가 템플릿의 파이프 구분 기호(`|`) 대신 사용됩니다.

```
COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName'
DELIMITER ','
USING TEMPLATE public.test_template;
```

# COPY 파라미터 참조
<a name="r_COPY-parameters"></a>

COPY에는 다양한 상황에서 사용할 수 있는 많은 파라미터가 있습니다. 그러나 각 상황에서 모든 파라미터가 지원되는 것은 아닙니다. 예를 들어 ORC 또는 PARQUET 파일에서 로드하는 경우 지원되는 파라미터 수가 제한되어 있습니다. 자세한 내용은 [열 기반 데이터 형식에서 COPY 명령](copy-usage_notes-copy-from-columnar.md) 섹션을 참조하세요.

**Topics**
+ [데이터 소스](copy-parameters-data-source.md)
+ [권한 부여 파라미터](copy-parameters-authorization.md)
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](copy-parameters-data-format.md)
+ [파일 압축 파라미터](copy-parameters-file-compression.md)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)
+ [알파벳 순서의 파라미터 목록](r_COPY-alphabetical-parm-list.md)

# 데이터 소스
<a name="copy-parameters-data-source"></a>

클러스터가 Amazon S3 버킷과 Amazon EMR 클러스터 또는 SSH 연결을 사용하여 액세스할 수 있는 원격 호스트에 위치한 텍스트 파일에서 데이터를 로드할 수 있습니다. 또한 DynamoDB 테이블에서도 데이터를 직접 로드할 수 있습니다.

어떤 원본이든지 상관없이 단일 입력 행의 최대 크기는 4MB입니다.

테이블에서 Amazon S3의 파일로 데이터를 내보내려면 [UNLOAD](r_UNLOAD.md) 명령을 사용합니다.

**Topics**
+ [Amazon S3에서 COPY](copy-parameters-data-source-s3.md)
+ [Amazon EMR에서 COPY](copy-parameters-data-source-emr.md)
+ [원격 호스트(SSH)에서 COPY 지원](copy-parameters-data-source-ssh.md)
+ [Amazon DynamoDB에서 COPY](copy-parameters-data-source-dynamodb.md)

# Amazon S3에서 COPY
<a name="copy-parameters-data-source-s3"></a>

1개 이상의 S3 버킷에 위치한 파일에서 데이터를 로드하려면 FROM 절을 사용하여 COPY가 Amazon S3의 파일을 찾는 방법을 지정합니다. 데이터 파일의 객체 경로를 FROM 절의 일부로 제공하거나 Amazon S3 객체 경로 목록이 포함된 매니페스트 파일의 위치를 제공할 수 있습니다. Amazon S3에서 COPY는 HTTPS 연결을 사용합니다. S3 IP 범위가 허용 목록에 추가되었는지 확인합니다. 필요한 S3 IP 범위에 대한 자세한 내용은 [네트워크 격리](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation)를 참조하세요.

**중요**  
데이터 파일이 위치한 Amazon S3 버킷이 클러스터와 동일한 AWS 리전에 속하지 않을 때는 [REGION](#copy-region) 파라미터를 사용하여 데이터가 위치한 리전을 지정해야 합니다.

**Topics**
+ [구문](#copy-parameters-data-source-s3-syntax)
+ [예제](#copy-parameters-data-source-s3-examples)
+ [선택적 파라미터](#copy-parameters-data-source-s3-optional-parms)
+ [지원되지 않는 파라미터](#copy-parameters-data-source-s3-unsupported-parms)

## 구문
<a name="copy-parameters-data-source-s3-syntax"></a>

```
FROM { 's3://objectpath' | 's3://manifest_file' }
authorization
| MANIFEST
| ENCRYPTED
| REGION [AS] 'aws-region'
| optional-parameters
```

## 예제
<a name="copy-parameters-data-source-s3-examples"></a>

다음은 객체 경로를 사용하여 Amazon S3에서 데이터를 로드하는 예입니다.

```
copy customer
from 's3://amzn-s3-demo-bucket/customer' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

다음은 매니페스트 파일을 사용하여 Amazon S3에서 데이터를 로드하는 예입니다.

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

### 파라미터
<a name="copy-parameters-data-source-s3-parameters"></a>

FROM  <a name="copy-parameters-from"></a>
로드할 데이터 원본입니다. Amazon S3 파일의 인코딩에 대한 자세한 내용은 [데이터 변환 파라미터](copy-parameters-data-conversion.md) 섹션을 참조하세요.

's3://*copy\$1from\$1s3\$1objectpath*'  <a name="copy-s3-objectpath"></a>
데이터가 포함된 Amazon S3 객체의 경로를 지정합니다(예: `'s3://amzn-s3-demo-bucket/custdata.txt'`). *s3://copy\$1from\$1s3\$1objectpath* 파라미터는 단일 파일, 또는 동일한 키 접두사를 갖는 객체 및 폴더 집합을 참조할 수 있습니다. 예를 들어 `custdata.txt`는 `custdata.txt`,`custdata.txt.1`, `custdata.txt.2`, `custdata.txt.bak` 등 다수의 물리적 파일을 참조하는 키 접두사입니다. 키 접두사는 다수의 폴더도 참조할 수 있습니다. 예를 들어 `'s3://amzn-s3-demo-bucket/custfolder'`는 `custfolder`, `custfolder_1`, `custfolder_2` 폴더 등을 참조합니다. 키 접두사가 다수의 폴더를 참조하는 경우 해당 폴더의 모든 파일이 로드됩니다. 키 접두사가 폴더는 물론 파일과도 일치하는 경우(예: `custfolder.log`) COPY가 파일도 로드하려고 합니다. 이처럼 키 접두사로 인해 COPY 명령이 불필요한 파일까지 로드하려고 할 때는 매니페스트 파일을 사용하세요. 자세한 내용은 다음 자료를 참조하세요.[copy_from_s3_manifest_file](#copy-manifest-file)  
데이터 파일이 위치한 S3 버킷이 클러스터와 동일한 AWS 리전에 속하지 않을 때는 [REGION](#copy-region) 파라미터를 사용하여 데이터가 위치한 리전을 지정해야 합니다.
자세한 내용은 [Amazon S3에서 데이터 로드](t_Loading-data-from-S3.md) 섹션을 참조하세요.

's3://*copy\$1from\$1s3\$1manifest\$1file*'  <a name="copy-manifest-file"></a>
로드할 데이터 파일을 나열하는 매니페스트 파일에 Amazon S3 객체 키를 지정합니다. *'s3://*copy\$1from\$1s3\$1manifest\$1file'** 인수는 단일 파일을 명시적으로 참조해야 합니다(예: `'s3://amzn-s3-demo-bucket/manifest.txt'`). 키 접두사를 참조할 수는 없습니다.  
매니페스트란 Amazon S3에서 로드할 개별 파일의 URL을 JSON 형식으로 나열한 텍스트 파일을 말합니다. URL에는 파일의 버킷 이름과 전체 객체 경로가 포함됩니다. 매니페스트에서 지정되는 파일이 서로 다른 버킷에 있을 수 있지만 모든 버킷은 Amazon Redshift 클러스터와 동일한 AWS 리전에 속해야 합니다. 파일이 두 번 나열되면 마찬가지로 두 번 로드됩니다. 다음은 3개의 파일을 로드하는 매니페스트의 JSON 형식을 나타낸 예입니다.  

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1","mandatory":false}
  ]
}
```
큰따옴표가 필요하며, 기울어진 따옴표나 "스마트" 따옴표가 아닌 단순한 따옴표(0x22)여야 합니다. 매니페스트의 각 항목은 옵션으로 `mandatory` 플래그를 추가할 수 있습니다. `mandatory`가 `true`로 설정된 경우 해당 항목에서 파일을 찾지 못하면 COPY 명령이 종료되고, 그렇지 않으면 COPY 명령이 계속 됩니다. `mandatory`의 기본값은 `false`입니다.  
ORC 또는 Parquet 형식의 데이터 파일에서 불러올 경우 다음 예에 나와 있는 것처럼 `meta` 필드가 필요합니다.  

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      },
      {  
         "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      }
   ]
}
```
매니페스트 파일에서도 ENCRYPTED, GZIP, LZOP, BZIP2 또는 ZSTD 옵션이 지정되지만 암호화하거나 압축해서는 안 됩니다. 지정된 매니페스트 파일을 찾지 못하거나, 혹은 매니페스트 파일의 형식이 잘못되면 COPY 명령이 오류를 반환합니다.  
매니페스트 파일을 사용할 때는 COPY 명령에서 MANIFEST 파라미터를 지정해야 합니다. MANIFEST 파라미터를 지정하지 않으면 COPY가 FROM에서 지정한 파일이 데이터 파일인 것으로 간주합니다.  
자세한 내용은 [Amazon S3에서 데이터 로드](t_Loading-data-from-S3.md) 섹션을 참조하세요.

*권한 부여*  
COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 권한은 클러스터에 연결되는 AWS Identity and Access Management(IAM) 역할을 참조하거나(역할 기반 액세스 제어) 사용자의 액세스 자격 증명을 입력하면(키 기반 액세스 제어) 부여할 수 있습니다. 보안과 유연성을 높이려면 IAM 역할 기반 액세스 제어를 권장합니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.

MANIFEST  <a name="copy-manifest"></a>
Amazon S3에서 로드할 데이터 파일을 식별할 때 매니페스트를 사용하도록 지정합니다. MANIFEST 파라미터를 사용하는 경우에는 COPY 명령이 *'s3://copy\$1from\$1s3\$1manifest\$1file'*에서 참조하는 매니페스트 파일에 나열된 파일에서 데이터를 로드합니다. 매니페스트 파일을 찾지 못하거나, 혹은 잘못된 형식일 때는 COPY가 중단됩니다. 자세한 내용은 [매니페스트를 사용하여 데이터 파일 지정](loading-data-files-using-manifest.md) 섹션을 참조하세요.

Encrypted  <a name="copy-encrypted"></a>
고객 관리형 키를 사용하는 클라이언트 측 암호화로 Amazon S3의 입력 파일을 암호화하도록 지정하는 절입니다. 자세한 내용은 [Amazon S3에서 암호화된 데이터 파일 로드](c_loading-encrypted-files.md) 섹션을 참조하세요. 입력 파일이 Amazon S3 서버 측 암호화(SSE-KMS 또는 SSE-S3)로 암호화되어 있는 경우에는 ENCRYPTED를 지정하지 마세요. COPY가 자동으로 서버 측 암호화 파일을 읽습니다.  
ENCRYPTED 파라미터를 지정하는 경우에는 [MASTER_SYMMETRIC_KEY](#copy-master-symmetric-key) 파라미터도 지정하거나, 혹은 **master\$1symmetric\$1key** 값을 [CREDENTIALS 파라미터 사용](copy-parameters-authorization.md#copy-credentials) 문자열에 추가해야 합니다.  
암호화된 파일이 압축 형식일 때는 GZIP, LZOP, BZIP2 또는 ZSTD 파라미터를 추가하세요.  
ENCRYPTED 옵션을 지정하더라도 매니페스트 파일과 JSONPaths 파일을 암호화해서는 안 됩니다.

MASTER\$1SYMMETRIC\$1KEY '*root\$1key*'  <a name="copy-master-symmetric-key"></a>
Amazon S3에서 데이터 파일을 암호화할 때 사용되는 루트 대칭 키입니다. MASTER\$1SYMMETRIC\$1KEY를 지정하면 [ENCRYPTED](#copy-encrypted) 파라미터도 지정해야 합니다. MASTER\$1SYMMETRIC\$1KEY를 CREDENTIALS 파라미터와 함께 사용할 수는 없습니다. 자세한 내용은 [Amazon S3에서 암호화된 데이터 파일 로드](c_loading-encrypted-files.md) 섹션을 참조하세요.  
암호화된 파일이 압축 형식일 때는 GZIP, LZOP, BZIP2 또는 ZSTD 파라미터를 추가하세요.

REGION [AS] '*aws-region*'  <a name="copy-region"></a>
원본 데이터가 위치한 AWS 리전을 지정합니다. 데이터가 위치한 AWS 리소스가 Amazon Redshift 클러스터와 동일한 리전에 속하지 않을 때는 Amazon S3 버킷 또는 DynamoDB 테이블에서 COPY를 실행하려면 REGION이 필요합니다.  
*aws\$1region*의 값은 [Amazon Redshift 리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region) 표에 나와 있는 리전과 일치해야 합니다.  
REGION 파라미터를 지정하면 매니페스트 파일 또는 여러 Amazon S3 버킷을 포함한 모든 리소스가 지정한 리전에 위치해야 합니다.  
리전 간 데이터를 전송하면 데이터가 있는 Amazon S3 버킷 또는 DynamoDB 테이블을 대상으로 추가 요금이 발생합니다. 요금에 대한 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/) 페이지의 **Amazon S3에서 다른 AWS 리전으로 데이터 전송** 및 [Amazon DynamoDB 요금](https://aws.amazon.com/dynamodb/pricing/) 페이지의 **데이터 전송(발신)** 섹션을 참조하세요.
기본적으로 COPY의 경우 데이터가 Amazon Redshift 클러스터와 동일한 리전에 위치한다고 가정합니다.

## 선택적 파라미터
<a name="copy-parameters-data-source-s3-optional-parms"></a>

Amazon S3에서 COPY를 지원할 때는 다음 파라미터를 옵션으로 지정할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](copy-parameters-data-format.md#copy-data-format-parameters)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)

## 지원되지 않는 파라미터
<a name="copy-parameters-data-source-s3-unsupported-parms"></a>

Amazon S3에서 COPY를 지원할 때는 다음 파라미터를 사용할 수 없습니다.
+ SSH
+ READRATIO

# Amazon EMR에서 COPY
<a name="copy-parameters-data-source-emr"></a>

COPY 명령을 사용하면 클러스터의 Hadoop 분산 파일 시스템(HDFS)에 고정 폭 파일, 문자로 구분된 파일, CSV 파일, JSON 파일 또는 Avro 파일 형식으로 텍스트 파일을 쓰도록 구성된 Amazon EMR 클러스터에서 병렬로 데이터를 로드할 수 있습니다.

**Topics**
+ [구문](#copy-parameters-data-source-emr-syntax)
+ [예제](#copy-parameters-data-source-emr-example)
+ [파라미터](#copy-parameters-data-source-emr-parameters)
+ [지원되는 파라미터](#copy-parameters-data-source-emr-optional-parms)
+ [지원되지 않는 파라미터](#copy-parameters-data-source-emr-unsupported-parms)

## 구문
<a name="copy-parameters-data-source-emr-syntax"></a>

```
FROM 'emr://emr_cluster_id/hdfs_filepath'  
authorization
[ optional_parameters ]
```

## 예제
<a name="copy-parameters-data-source-emr-example"></a>

다음은 Amazon EMR 클러스터에서 데이터를 로드하는 예입니다.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## 파라미터
<a name="copy-parameters-data-source-emr-parameters"></a>

FROM  
로드할 데이터 원본입니다.

 'emr://*emr\$1cluster\$1id*/*hdfs\$1file\$1path*'  <a name="copy-emr"></a>
COPY 명령에서 데이터 파일을 참조하는 Amazon EMR 클러스터 및 HDFS 파일 경로의 고유 식별자입니다. HDFS 데이터 파일 이름에는 와일드카드 문자인 별표(\$1)와 물음표(?)가 포함되어서는 안 됩니다.  
Amazon EMR 클러스터는 COPY 작업이 완료될 때까지 계속 실행되어야 합니다. COPY 작업을 마치기 전에 HDFS 데이터 파일이 하나라도 변경되거나 삭제되면 예상하지 못한 결과가 나오거나 COPY 작업이 중단될 수 있습니다.
와일드카드 문자인 별표(\$1)와 물음표(?)를 *hdfs\$1file\$1path* 인수에 사용하여 다수의 파일을 로드하도록 지정할 수 있습니다. 예를 들어 `'emr://j-SAMPLE2B500FC/myoutput/part*'`는 파일 `part-0000`, `part-0001` 등을 식별합니다. 와일드카드 문자가 없는 파일 경로는 문자열 리터럴로 처리됩니다. 폴더 이름만 지정하면 COPY가 폴더의 모든 파일을 로드하려고 합니다.  
와일드카드 문자를 사용하거나 폴더 이름만 사용하는 경우에는 불필요한 파일이 로드되지 않는지 확인하세요. 예를 들어 일부 프로세스에서는 로그 파일이 출력 폴더로 로드되는 경우도 있습니다.
자세한 내용은 [Amazon EMR에서 데이터 로드](loading-data-from-emr.md) 섹션을 참조하세요.

*권한 부여*  
COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 권한은 클러스터에 연결되는 AWS Identity and Access Management(IAM) 역할을 참조하거나(역할 기반 액세스 제어) 사용자의 액세스 자격 증명을 입력하면(키 기반 액세스 제어) 부여할 수 있습니다. 보안과 유연성을 높이려면 IAM 역할 기반 액세스 제어를 권장합니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.

## 지원되는 파라미터
<a name="copy-parameters-data-source-emr-optional-parms"></a>

Amazon EMR에서 COPY를 지원할 때는 다음 파라미터를 옵션으로 지정할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](copy-parameters-data-format.md#copy-data-format-parameters)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)

## 지원되지 않는 파라미터
<a name="copy-parameters-data-source-emr-unsupported-parms"></a>

Amazon EMR에서 COPY를 지원할 때는 다음 파라미터를 사용할 수 없습니다.
+ Encrypted
+ MANIFEST
+ REGION
+ READRATIO
+ SSH

# 원격 호스트(SSH)에서 COPY 지원
<a name="copy-parameters-data-source-ssh"></a>

COPY 명령을 사용하면 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스나 다른 컴퓨터 같은 하나 이상의 원격 호스트에서 병렬로 파일을 로드할 수 있습니다. COPY는 SSH(Secure Shell)을 사용하여 원격 호스트에 연결하고 원격 호스트에서 명령을 실행해 텍스트 출력을 생성합니다. 원격 호스트는 EC2 Linux 인스턴스이거나 SSH 연결을 허용하도록 구성된 다른 Unix 또는 Linux 컴퓨터일 수 있습니다. Amazon Redshift는 여러 호스트에 연결할 수 있으며 각 호스트에 대해 여러 SSH 연결을 열 수 있습니다. Amazon Redshift는 각 연결을 통해 고유한 명령을 전송하여 호스트의 표준 출력에 대한 텍스트 출력을 생성합니다. 그러면 Amazon Redshift가 텍스트 파일을 읽을 때 텍스트 출력을 읽습니다.

FROM 절은 매니페스트 파일에 Amazon S3 객체 키를 지정할 때 사용합니다. 매니페스트 파일은 COPY가 SSH 연결을 열어 원격 명령을 실행할 때 사용할 정보를 제공합니다.

**Topics**
+ [구문](#copy-parameters-data-source-ssh-syntax)
+ [예제](#copy-parameters-data-source-ssh-examples)
+ [파라미터](#copy-parameters-data-source-ssh-parameters)
+ [선택적 파라미터](#copy-parameters-data-source-ssh-optional-parms)
+ [지원되지 않는 파라미터](#copy-parameters-data-source-ssh-unsupported-parms)

**중요**  
 매니페스트 파일이 위치한 S3 버킷이 클러스터와 동일한 AWS 리전에 속하지 않을 때는 REGION 파라미터를 사용하여 버킷이 위치한 리전을 지정해야 합니다.

## 구문
<a name="copy-parameters-data-source-ssh-syntax"></a>

```
FROM 's3://'ssh_manifest_file' }
authorization
SSH
| optional-parameters
```

## 예제
<a name="copy-parameters-data-source-ssh-examples"></a>

다음은 매니페스트 파일을 사용하여 원격 호스트에서 SSH 연결을 통해 데이터를 로드하는 예입니다.

```
copy sales
from 's3://amzn-s3-demo-bucket/ssh_manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
ssh;
```

## 파라미터
<a name="copy-parameters-data-source-ssh-parameters"></a>

FROM  
로드할 데이터 원본입니다.

's3://*copy\$1from\$1ssh\$1manifest\$1file*'  <a name="copy-ssh-manifest"></a>
COPY 명령은 SSH를 사용하여 다수의 호스트에 연결할 뿐만 아니라 각 호스트마다 SSH 연결을 생성할 수 있습니다. 이렇게 생성된 각 호스트 연결을 통해 명령을 실행하고, 명령을 통해 출력되는 데이터를 병렬 방식으로 테이블에 로드합니다. *s3://copy\$1from\$1ssh\$1manifest\$1file* 인수는 매니페스트 파일에 Amazon S3 객체 키를 지정합니다. 매니페스트 파일은 COPY가 SSH 연결을 열어 원격 명령을 실행할 때 사용할 정보를 제공합니다.  
*s3://copy\$1from\$1ssh\$1manifest\$1file* 인수는 명시적으로 단일 파일을 참조해야 합니다. 이때 파일은 키 접두사가 될 수 없습니다. 다음은 그 한 예입니다.  

```
's3://amzn-s3-demo-bucket/ssh_manifest.txt'
```
매니페스트 파일은 Amazon Redshift가 호스트에 연결하는 데 사용하는 JSON 형식의 텍스트 파일입니다. 매니페스트 파일은 SSH 호스트 엔드포인트를 비롯해 호스트에서 데이터를 Amazon Redshift에 반환할 때 실행하는 명령을 지정합니다. 필요한 경우, 호스트 퍼블릭 키, 로그인 사용자 이름 및 각 항목의 필수 플래그를 포함시킬 수 있습니다. 다음은 SSH 연결 2개를 생성하는 매니페스트 파일 예입니다.  

```
{ 
    "entries": [ 
	    {"endpoint":"<ssh_endpoint_or_IP>", 
           "command": "<remote_command>",
           "mandatory":true, 
           "publickey": "<public_key>", 
           "username": "<host_user_name>"}, 
	    {"endpoint":"<ssh_endpoint_or_IP>", 
           "command": "<remote_command>",
           "mandatory":true, 
           "publickey": "<public_key>", 
           "username": "<host_user_name>"} 
     ] 
}
```
매니페스트 파일에는 SSH 연결마다 `"entries"` 구문이 하나씩 포함됩니다. 단일 호스트에 다중 연결을, 혹은 다수의 호스트에 다중 연결을 생성할 수 있습니다. 표시된 대로 필드 이름과 값 모두에 큰따옴표가 필요하며, 기울어진 따옴표나 "스마트" 따옴표가 아닌 단순한 따옴표(0x22)여야 합니다. 큰따옴표가 필요하지 않은 유일한 값은 `"mandatory"` 필드의 부울 값인 `true` 또는 `false`입니다.  
다음 표에서는 매니페스트 파일의 속성을 설명합니다.    
엔드포인트  <a name="copy-ssh-manifest-endpoint"></a>
호스트의 URL 주소 또는 IP 주소(예: `"ec2-111-222-333.compute-1.amazonaws.com"` 또는 `"198.51.100.0"`).  
명령  <a name="copy-ssh-manifest-command"></a>
호스트에서 gzip, lzop, bzip2 또는 zstd 형식으로 텍스트 출력 또는 이진수 출력을 생성할 때 실행하는 명령입니다. 명령은 사용자 *"host\$1user\$1name"*이 실행 권한을 갖고 있는 어떤 명령도 될 수 있습니다. 명령은 파일 인쇄처럼 간단할 수도 있고 데이터베이스 쿼리나 스크립트 시작이 될 수도 있습니다. 출력(텍스트 파일, gzip 이진 파일, lzop 이진 파일 또는 bzip2 이진 파일)은 Amazon Redshift COPY 명령이 수집할 수 있는 형식이어야 합니다. 자세한 내용은 [입력 데이터 준비](t_preparing-input-data.md) 섹션을 참조하세요.  
publickey  <a name="copy-ssh-manifest-publickey"></a>
(옵션) 호스트의 퍼블릭 키입니다. 퍼블릭 키를 입력하면 Amazon Redshift가 호스트를 식별하는 데 이 키를 사용합니다. 퍼블릭 키를 입력하지 않으면 Amazon Redshift가 호스트를 식별하지 않습니다. 예를 들어 원격 호스트의 퍼블릭 키가 `ssh-rsa AbcCbaxxx…Example root@amazon.com`인 경우에는 publickey 필드에 `"AbcCbaxxx…Example"` 텍스트를 입력하세요.  
mandatory  <a name="copy-ssh-manifest-mandatory"></a>
(옵션) 연결 시도가 실패할 경우 COPY 명령의 중단 여부를 나타내는 절입니다. 기본값은 `false`입니다. Amazon Redshift가 하나 이상 연결에 성공하지 못하면 COPY 명령이 중단됩니다.  
사용자 이름  <a name="copy-ssh-manifest-username"></a>
(옵션) 호스트 시스템에 로그온하고 원격 명령을 실행하기 위해 사용할 사용자 이름입니다. 사용자 로그인 이름은 권한이 부여된 호스트 키 파일에 Amazon Redshift 클러스터의 퍼블릭 키를 추가할 때 사용한 로그인 이름과 동일해야 합니다. 기본 위치는 `redshift`입니다.
매니페스트 파일 생성에 대한 자세한 내용은 [데이터 로드 프로세스](loading-data-from-remote-hosts.md#load-from-host-process) 섹션을 참조하세요.  
원격 호스트에서 COPY를 지원할 때는 COPY 명령에서 SSH 파라미터를 지정해야 합니다. SSH 파라미터를 지정하지 않으면 COPY가 FROM에서 지정한 파일이 데이터 파일인 것으로 간주하여 중단되고 맙니다.  
자동 압축을 사용하는 경우 COPY 명령은 데이터 읽기 작업을 2회 실행합니다. 즉, 원격 명령을 2회 실행합니다. 첫 번째 읽기 작업은 압축 분석을 위한 데이터 샘플을 제공하기 위한 것이며, 두 번째 읽기 작업에서 실제로 데이터를 로드합니다. 원격 명령 2회 실행이 문제를 일으킬 수 있는 경우에는 자동 압축을 비활성화해야 합니다. 자동 압축을 비활성화하려면 COMPUPDATE 파라미터를 OFF로 설정하여 COPY 명령을 실행합니다. 자세한 내용은 [자동 압축을 사용하여 테이블 로드](c_Loading_tables_auto_compress.md) 섹션을 참조하세요.  
SSH에서 COPY를 사용하는 자세한 절차는 [원격 호스트에서 데이터 로드](loading-data-from-remote-hosts.md) 섹션을 참조하세요.

*권한 부여*  
COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 권한은 클러스터에 연결되는 AWS Identity and Access Management(IAM) 역할을 참조하거나(역할 기반 액세스 제어) 사용자의 액세스 자격 증명을 입력하면(키 기반 액세스 제어) 부여할 수 있습니다. 보안과 유연성을 높이려면 IAM 역할 기반 액세스 제어를 권장합니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.

SSH  <a name="copy-ssh"></a>
원격 호스트에서 데이터를 로드할 때 SSH 프로토콜을 사용하도록 지정하는 절입니다. SSH를 지정하는 경우에는 [s3://copy_from_ssh_manifest_file](#copy-ssh-manifest) 인수를 사용하여 매니페스트 파일도 지정해야 합니다.  
SSH를 사용하여 원격 VPC에서 프라이빗 IP 주소를 사용하는 호스트에서 복사하는 경우 VPC는 향상된 VPC 라우팅을 사용하도록 설정해야 합니다. Enhanced VPC Routing에 대한 자세한 내용은 [Amazon Redshift Enhanced VPC Routing](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html) 섹션을 참조하세요.

## 선택적 파라미터
<a name="copy-parameters-data-source-ssh-optional-parms"></a>

SSH 연결을 통해 COPY를 사용할 때는 다음 파라미터를 옵션으로 지정할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](copy-parameters-data-format.md#copy-data-format-parameters)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)

## 지원되지 않는 파라미터
<a name="copy-parameters-data-source-ssh-unsupported-parms"></a>

SSH에서 COPY를 사용할 때는 다음 파라미터를 사용할 수 없습니다.
+ Encrypted
+ MANIFEST
+ READRATIO

# Amazon DynamoDB에서 COPY
<a name="copy-parameters-data-source-dynamodb"></a>

기존 DynamoDB 테이블에서 데이터를 로드할 때는 FROM 절을 사용하여 DynamoDB 테이블 이름을 지정합니다.

**Topics**
+ [구문](#copy-parameters-data-source-dynamodb-syntax)
+ [예제](#copy-parameters-data-source-dynamodb-examples)
+ [선택적 파라미터](#copy-parameters-data-source-dynamodb-optional-parms)
+ [지원되지 않는 파라미터](#copy-parameters-data-source-dynamodb-unsupported-parms)

**중요**  
DynamoDB 테이블이 Amazon Redshift 클러스터와 동일한 리전에 속하지 않는 경우에는 REGION 파라미터를 사용하여 데이터가 위치한 리전을 지정해야 합니다.

## 구문
<a name="copy-parameters-data-source-dynamodb-syntax"></a>

```
FROM 'dynamodb://table-name' 
authorization
READRATIO ratio
| REGION [AS] 'aws_region'  
| optional-parameters
```

## 예제
<a name="copy-parameters-data-source-dynamodb-examples"></a>

다음은 DynamoDB 테이블에서 데이터를 로드하는 예입니다.

```
copy favoritemovies from 'dynamodb://ProductCatalog'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
readratio 50;
```

### 파라미터
<a name="copy-parameters-data-source-dynamodb-parameters"></a>

FROM  
로드할 데이터 원본입니다.

'dynamodb://*table-name*'  <a name="copy-dynamodb"></a>
데이터가 들어 있는 DynamoDB 테이블의 이름입니다(예: `'dynamodb://ProductCatalog'`). DynamoDB 속성과 Amazon Redshift 열의 매핑 방식에 대한 자세한 내용은 [Amazon DynamoDB 테이블에서 데이터 로드](t_Loading-data-from-dynamodb.md) 섹션을 참조하세요.  
DynamoDB 테이블 이름은 AWS 계정에서 고유하여 AWS 액세스 자격 증명으로 식별됩니다.

*권한 부여*  
COPY 명령을 실행하려면 Amazon S3, Amazon EMR, DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 권한은 클러스터에 연결되는 AWS Identity and Access Management(IAM) 역할을 참조하거나(역할 기반 액세스 제어) 사용자의 액세스 자격 증명을 입력하면(키 기반 액세스 제어) 부여할 수 있습니다. 보안과 유연성을 높이려면 IAM 역할 기반 액세스 제어를 권장합니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.

READRATIO [AS] *ratio*  <a name="copy-readratio"></a>
DynamoDB 테이블에서 데이터 로드에 사용할 프로비저닝 처리량의 비율입니다. READRATIO는 DynamoDB에서 COPY에 필요합니다. Amazon S3에서 COPY를 지원할 때는 사용할 수 없습니다. 이 비율은 사용되지 않는 평균 프로비저닝 처리량 미만의 값으로 설정하는 것이 좋습니다. 유효한 값은 1\$1200의 정수입니다.  
READRATIO를 100 이상으로 설정하면 Amazon Redshift가 DynamoDB 테이블의 프로비저닝된 처리량을 완전히 소비하여 COPY 세션 도중 동일한 테이블에 대한 동시 읽기 작업 성능을 심각하게 떨어뜨릴 수 있습니다. 쓰기 트래픽은 영향을 받지 않습니다. 100보다 높은 값일 때는 Amazon Redshift가 테이블의 프로비저닝 처리량을 충족하지 못하는 드문 경우의 문제를 해결할 수 있습니다. DynamoDB에서 Amazon Redshift로 데이터를 지속적으로 로드하는 경우에는 DynamoDB 테이블을 시계열로 구성하여 COPY 작업에서 실시간 트래픽을 분리하는 것이 좋습니다.

## 선택적 파라미터
<a name="copy-parameters-data-source-dynamodb-optional-parms"></a>

Amazon DynamoDB에서 COPY를 지원할 때는 다음 파라미터를 옵션으로 지정할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ 지원되는 데이터 변환 파라미터는 다음과 같습니다.
  + [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate) 
  + [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull) 
  + [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat) 
  + [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull) 
  + [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 
  + [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat) 
  + [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks) 
  + [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns) 
+ [데이터 로드 작업](copy-parameters-data-load.md)

## 지원되지 않는 파라미터
<a name="copy-parameters-data-source-dynamodb-unsupported-parms"></a>

DynamoDB에서 COPY를 지원할 때는 다음 파라미터를 사용할 수 없습니다.
+ 모든 데이터 형식 파라미터
+ ESCAPE
+ FILLRECORD
+ IGNOREBLANKLINES
+ IGNOREHEADER
+ NULL
+ REMOVEQUOTES
+ ACCEPTINVCHARS
+ MANIFEST
+ Encrypted

# 권한 부여 파라미터
<a name="copy-parameters-authorization"></a>

COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 클러스터에 연결되어 있는 [AWS Identity and Access Management(IAM) 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)을 참조하여 이러한 권한을 부여할 수 있습니다(*역할 기반 액세스 제어*). Amazon S3에서 로드 데이터를 암호화할 수 있습니다.

아래 주제에서는 더욱 자세한 내용과 함께 인증 옵션의 예를 살펴보겠습니다.
+ [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)
+ [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)
+ [키 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based)

COPY 명령에서는 다음 중 한 가지를 사용하여 권한을 부여합니다.
+ [IAM\$1ROLE 파라미터 사용](#copy-iam-role) 파라미터
+ [ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터 사용](#copy-access-key-id) 파라미터
+ [CREDENTIALS 파라미터 사용](#copy-credentials) 절

## IAM\$1ROLE 파라미터 사용
<a name="copy-iam-role"></a>

### IAM\$1ROLE
<a name="copy-iam-role-iam"></a>

기본 키워드를 사용하여 COPY 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다.

클러스터가 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다. IAM\$1ROLE을 지정하면 ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN 또는 CREDENTIALS는 사용할 수 없습니다.

다음은 IAM\$1ROLE 파라미터에 대한 구문을 나타낸 것입니다.

```
IAM_ROLE { default | 'arn:aws:iam::<AWS 계정-id>:role/<role-name>' }
```

자세한 내용은 [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 섹션을 참조하세요.

## ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터 사용
<a name="copy-access-key-id"></a>

### ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY
<a name="copy-access-key-id-access"></a>

이 권한 부여 방법은 권장되지 않습니다.

**참고**  
일반 텍스트로 입력되는 액세스 자격 증명보다는 IAM\$1ROLE 파라미터를 지정하는 역할 기반 인증의 사용을 강력하게 권장합니다. 자세한 내용은 [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 섹션을 참조하세요.

### SESSION\$1TOKEN
<a name="copy-token"></a>

임시 액세스 자격 증명으로 사용되는 세션 토큰입니다. SESSION\$1TOKEN을 지정할 때도 ACCESS\$1KEY\$1ID와 SECRET\$1ACCESS\$1KEY를 사용하여 임시 액세스 키 자격 증명을 입력해야 합니다. SESSION\$1TOKEN을 지정하면 IAM\$1ROLE 또는 CREDENTIALS는 사용할 수 없습니다. 자세한 내용은 IAM 사용 설명서에서 [임시 보안 자격 증명](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials) 섹션을 참조하세요.

**참고**  
임시 보안 자격 증명을 생성하는 것보다는 역할 기반 인증의 사용을 강력하게 권장합니다. IAM 역할을 사용하여 권한을 부여하면 Amazon Redshift가 각 세션마다 임시 사용자 자격 증명을 자동으로 생성합니다. 자세한 내용은 [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 섹션을 참조하세요.

다음은 ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터를 사용한 SESSION\$1TOKEN 파라미터의 구문 예입니다.

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

SESSION\$1TOKEN을 지정하면 CREDENTIALS 또는 IAM\$1ROLE은 사용할 수 없습니다.

## CREDENTIALS 파라미터 사용
<a name="copy-credentials"></a>

### CREDENTIALS
<a name="copy-credentials-cred"></a>

클러스터가 데이터 파일 또는 매니페스트 파일이 위치한 다른 AWS 리소스에 액세스할 때 사용할 방법을 나타내는 절입니다. CREDENTIALS 파라미터는 IAM\$1ROLE 또는 ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY와 함께 사용할 수 없습니다.

다음은 CREDENTIALS 파라미터에 대한 구문을 보여줍니다.

```
[WITH] CREDENTIALS [AS] 'credentials-args'
```

**참고**  
유연성을 높이려면 CREDENTIALS 파라미터 대신 [IAM\$1ROLE](#copy-iam-role-iam) 파라미터를 사용하는 것이 좋습니다.

옵션으로 [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 파라미터를 사용하는 경우에는 *credentials-args* 문자열 역시 암호화 키의 역할을 합니다.

*credentials-args* 문자열은 대소문자를 구분하며 공백이 포함되어서는 안됩니다.

키워드 WITH와 AS는 옵션이며 무시해도 좋습니다.

[role-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based.phrase) 또는 [key-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based.phrase)를 지정할 수 있습니다. 어떤 액세스 제어를 지정하든 간에 IAM 역할 또는 사용자는 지정한 AWS 리소스에 액세스할 수 있는 권한이 필요합니다. 자세한 내용은 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions) 섹션을 참조하세요.

**참고**  
AWS 자격 증명을 안전하게 지키고 민감한 데이터를 보호하려면 역할 기반 액세스 제어의 사용을 강력하게 권장합니다.

역할 기반 액세스 제어를 지정하려면 *credentials-args* 문자열을 다음과 같은 형식으로 입력합니다.

```
'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
```

임시 토큰 자격 증명을 사용하려면 임시 액세스 키 ID와 임시 보안 액세스 키, 그리고 임시 토큰을 입력해야 합니다. *credentials-args* 문자열의 형식은 다음과 같습니다.

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;token=<temporary-token>'
```

임시 자격 증명과 함께 역할 기반 액세스 제어를 사용하는 COPY 명령은 다음 샘플 문과 유사합니다.

```
COPY customer FROM 's3://amzn-s3-demo-bucket/mydata' 
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key-id>;token=<temporary-token>'
```

 자세한 내용은 [임시 보안 자격 증명](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials) 섹션을 참조하세요.

[ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 파라미터를 사용하는 경우 *credentials-args* 문자열의 형식은 다음과 같습니다. 여기에서 *<root-key>*는 파일을 암호화할 때 사용한 루트 키의 값입니다.

```
CREDENTIALS
'<credentials-args>;master_symmetric_key=<root-key>'
```

암호화 키와 함께 역할 기반 액세스 제어를 사용하는 COPY 명령은 다음 샘플 문과 유사합니다.

```
COPY customer FROM 's3://amzn-s3-demo-bucket/mydata' 
CREDENTIALS 
'aws_iam_role=arn:aws:iam::<account-id>:role/<role-name>;master_symmetric_key=<root-key>'
```

# 열 매핑 옵션
<a name="copy-parameters-column-mapping"></a>

기본적으로 COPY 명령은 데이터 파일의 필드 순서와 동일하게 값을 대상 테이블의 열에 삽입합니다. 기본 열 순서가 유효하지 않은 경우에는 열 목록을 지정하거나 JSONPath 표현식을 사용하여 원본 데이터 필드를 대상 열로 매핑할 수 있습니다.
+ [Column List](#copy-column-list)
+ [JSONPaths File](#copy-column-mapping-jsonpaths)

## 열 목록
<a name="copy-column-list"></a>

열 이름이 쉼표로 구분된 목록을 지정하여 원본 데이터 필드를 특정 대상 열로 로드할 수 있습니다. COPY 문에서는 열의 순서가 정해져 있지 않지만 Amazon S3 버킷과 같은 플랫 파일에서 로드할 때는 원본 데이터의 순서와 일치해야 합니다.

Amazon DynamoDB 테이블에서 로드할 때는 순서가 중요하지 않습니다. COPY 명령은 DynamoDB 테이블에서 가져오는 항목의 속성 이름을 Amazon Redshift 테이블의 열 이름과 일치시킵니다. 자세한 내용은 [Amazon DynamoDB 테이블에서 데이터 로드](t_Loading-data-from-dynamodb.md) 섹션을 참조하세요.

 열 목록의 형식은 다음과 같습니다.

```
COPY tablename (column1 [,column2, ...]) 
```

대상 테이블의 열이 열 목록에서 빠져있으면 COPY가 대상 열의 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 표현식을 로드합니다.

대상 열에 기본값이 없으면 COPY가 NULL을 로드하려고 합니다.

NOT NULL로 정의된 열에 COPY가 NULL을 할당하려고 하면 COPY 명령이 실패합니다.

[IDENTITY](r_CREATE_TABLE_NEW.md#identity-clause) 열이 열 목록에 포함되어 있으면 [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids) 역시 지정해야 합니다. 반대로 IDENTITY 열이 없으면 EXPLICIT\$1IDS를 지정할 수 없습니다. 열 목록을 지정하지 않으면 COPY 명령이 마치 열 목록이 순서에 따라 완전하게 지정되어 있는 것처럼, 그리고 EXPLICIT\$1IDS도 지정하지 않은 것처럼 IDENTITY 열을 생략하여 실행됩니다.

열이 GENERATED BY DEFAULT AS IDENTITY로 정의된 경우 복사할 수 있습니다. 값이 새로 생성되거나 입력한 값으로 업데이트됩니다. EXPLICIT\$1IDS 옵션은 필요하지 않습니다. COPY는 자격 증명 하이 워터마크를 업데이트하지 않습니다. 자세한 내용은 [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause) 섹션을 참조하세요.

## JSONPaths 파일
<a name="copy-column-mapping-jsonpaths"></a>

데이터 파일에서 데이터를 JSON 또는 Avro 형식으로 로드할 때는 COPY 명령이 JSON 또는 Avro 원본 데이터의 데이터 요소를 대상 테이블 열에 자동으로 매핑합니다. 이는 Avro 스키마의 필드 이름을 대상 테이블 또는 열 목록의 열 이름과 일치시키는 방식으로 수행됩니다.

경우에 따라 열 이름과 필드 이름이 일치하지 않거나 데이터 계층의 더 깊은 수준에 매핑해야 합니다. 이러한 경우 JSONPaths 파일을 사용하여 JSON 또는 Avro 데이터 요소를 열에 명시적으로 매핑할 수 있습니다.

자세한 내용은 [JSONPaths 파일](copy-parameters-data-format.md#copy-json-jsonpaths) 섹션을 참조하세요.

# 데이터 형식 파라미터
<a name="copy-parameters-data-format"></a>

COPY 명령에서는 기본적으로 원본 데이터가 문자로 구분된 UTF-8 텍스트 형식입니다. 기본 구분자는 파이프 문자(\$1)입니다. 원본 데이터가 다른 형식인 경우에는 다른 파라미터를 사용하여 데이터 형식을 지정합니다: 
+ [FORMAT](#copy-format)
+ [CSV](#copy-csv)
+ [DELIMITER](#copy-delimiter) 
+ [FIXEDWIDTH](#copy-fixedwidth) 
+ [SHAPEFILE](#copy-shapefile) 
+ [AVRO](#copy-avro) 
+ [JSON format for COPY](#copy-json) 
+ [PARQUET](#copy-parquet) 
+ [ORC](#copy-orc) 

COPY는 표준 데이터 형식 외에도 Amazon S3에서 COPY를 실행할 때 다음과 같은 열 기반 데이터 형식을 지원합니다.
+ [ORC](#copy-orc) 
+ [PARQUET](#copy-parquet) 

열 기반 형식에서의 COPY는 지원되지만 특정 제한이 따릅니다. 자세한 내용은 [열 기반 데이터 형식에서 COPY 명령](copy-usage_notes-copy-from-columnar.md) 섹션을 참조하세요.<a name="copy-data-format-parameters"></a>데이터 형식 파라미터

FORMAT [AS]  <a name="copy-format"></a>
(선택 사항) 데이터 형식 키워드를 식별합니다. FORMAT 인수는 다음과 같습니다.

CSV [ QUOTE [AS] *'quote\$1character'* ]  <a name="copy-csv"></a>
입력 데이터에서 CSV 형식을 사용할 수 있습니다. 구분자와 줄 바꿈 문자, 그리고 캐리지 리턴을 자동으로 이스케이프하려면 QUOTE 파라미터에서 지정한 문자로 묶습니다. 기본 인용 부호는 큰따옴표(")입니다. 필드 안에서 인용 부호를 사용할 때는 추가 인용 부호로 이스케이프 처리해야 합니다. 예를 들어 인용 부호로 큰따옴표를 사용한다고 가정할 때 문자열 `A "quoted" word`는 입력 파일에 문자열 `"A ""quoted"" word"`로 삽입해야 합니다. CSV 파라미터를 사용할 때는 기본 구분자가 쉼표(,)입니다. DELIMITER 파라미터를 사용하여 다른 구분자를 지정할 수도 있습니다.  
필드가 인용 부호로 묶이면 구분자와 인용 부호 사이의 공백은 무시됩니다. 구분자가 탭과 같은 공백 문자라면 구분자를 공백으로 처리하지 않습니다.  
CSV는 FIXEDWIDTH, REMOVEQUOTES 또는 ESCAPE와 함께 사용할 수 없습니다.    
QUOTE [AS] *'quote\$1character'*  <a name="copy-csv-quote"></a>
선택 사항입니다. CSV 파라미터 사용 시 인용 부호로 사용할 문자를 지정합니다. 기본 문자는 큰 따옴표(")입니다. QUOTE 파라미터를 사용하여 큰따옴표 이외의 다른 인용 부호를 정의하는 경우 필드 내에서 큰따옴표를 이스케이프 처리할 필요는 없습니다. QUOTE 파라미터는 CSV 파라미터하고만 사용할 수 있습니다. AS 키워드는 옵션입니다.

DELIMITER [AS] ['*delimiter\$1char*']   <a name="copy-delimiter"></a>
파이프 문자(`|`), 쉼표(`,`), 탭(`\t`) 또는 `|~|` 기호 등의 여러 문자와 같이 입력 파일의 필드를 구분하는 데 사용되는 문자를 지정합니다. 인쇄할 수 없는 문자가 지원됩니다. 문자를 UTF-8 코드 단위로 8진수로 표시할 수도 있습니다. 8진수로는 '\$1ddd' 형식을 사용하는데, 여기서 'd'는 8진수(0\$17)를 나타냅니다. 기본 구분자는 CSV 파라미터를 사용하지 않는 한 파이프 문자(`|`)입니다. CSV 파라미터를 사용할 경우에는 쉼표(`,`)가 기본 구분자입니다. AS 키워드는 옵션입니다. DELIMITER는 FIXEDWIDTH와 함께 사용할 수 없습니다.

FIXEDWIDTH '*fixedwidth\$1spec*'  <a name="copy-fixedwidth"></a>
각 열이 구분자로 구분되지 않고, 폭의 길이가 고정되어 있는 파일에서 데이터를 로드합니다. *fixedwidth\$1spec*은 열의 레이블과 폭을 사용자 지정하는 문자열입니다. 열 레이블은 사용자 선택에 따라 문자열 또는 정수가 될 수 있습니다. 열 레이블은 열 이름과 관계가 없습니다. 레이블/폭 페어의 순서는 테이블 열의 순서와 정확히 일치해야 합니다. FIXEDWIDTH는 CSV 또는 DELIMITER와 함께 사용할 수 없습니다. Amazon Redshift에서는 CHAR 및 VARCHAR 열의 길이가 바이트로 표현됩니다. 따라서 로드할 파일을 준비할 때는 지정하는 열의 폭이 멀티바이트 문자의 이진 길이를 수용할 정도로 충분한지 확인해야 합니다. 자세한 내용은 [문자 형식](r_Character_types.md) 섹션을 참조하세요.  
*fixedwidth\$1spec*의 형식은 다음과 같습니다.  

```
'colLabel1:colWidth1,colLabel:colWidth2, ...'
```

SHAPEFILE [ SIMPLIFY [AUTO] [*'tolerance'*] ]  <a name="copy-shapefile"></a>
입력 데이터에서 SHAPEFILE 형식을 사용할 수 있습니다. 기본적으로 shapefile의 첫 번째 열은 `GEOMETRY` 또는 `IDENTITY` 열입니다. 모든 후속 열은 shapefile에 지정된 순서를 따릅니다.  
FIXEDWIDTH, REMOVEQUOTES 또는 ESCAPE와 함께 SHAPEFILE을 사용할 수 없습니다.  
`COPY FROM SHAPEFILE`과 함께 `GEOGRAPHY` 객체를 사용하려면 먼저 `GEOMETRY` 열로 수집한 다음 객체를 `GEOGRAPHY` 객체로 캐스팅합니다.    
SIMPLIFY [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(옵션) Ramer-Douglas-Peucker 알고리즘과 주어진 허용치를 사용하여 수집 프로세스 동안 모든 지오메트리를 단순화합니다.  
SIMPLIFY AUTO [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(옵션) 최대 지오메트리 크기보다 큰 지오메트리만 단순화합니다. 이 단순화는 Ramer-Douglas-Peucker 알고리즘과 자동으로 계산된 허용치(지정된 허용치를 초과하지 않는 경우)를 사용합니다. 이 알고리즘은 지정된 허용치 내에서 객체를 저장할 크기를 계산합니다. *허용치* 값은 옵션입니다.
shapefile 로드의 예는 [Amazon Redshift에 shapefile 로드](r_COPY_command_examples.md#copy-example-spatial-copy-shapefile) 섹션을 참조하세요.

AVRO [AS] '*avro\$1option*'  <a name="copy-avro"></a>
원본 데이터를 Avro 형식으로 지정합니다.  
Avro 형식은 다음과 같은 서비스 및 프로토콜을 통해 COPY에 지원됩니다.  
+ Amazon S3 
+ Amazon EMR 
+ 원격 호스트(SSH) 
Avro는 DynamoDB에서 COPY에 대해 지원되지 않습니다.  
Avro는 데이터 직렬화 프로토콜입니다. Avro 원본 파일에는 데이터 구조를 정의하는 스키마가 저장되어 있습니다. Avro 스키마 형식은 `record`가 되어야 합니다. COPY에서는 기본 비압축 코덱과 `deflate` 및 `snappy` 압축 코덱을 사용하여 생성된 Avro 파일이 허용됩니다. Avro에 대한 자세한 내용은 [Apache Avro](https://avro.apache.org/)에서 확인할 수 있습니다.  
*avro\$1option*의 유효 값은 다음과 같습니다.  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
기본값은 `'auto'`입니다.  
COPY는 Avro 원본 데이터의 데이터 요소를 대상 테이블의 열에 자동으로 매핑합니다. 이는 Avro 스키마의 필드 이름을 대상 테이블의 열 이름과 일치시키는 방식으로 수행됩니다. 일치는 `'auto'`의 경우 대/소문자를 구분하고 `'auto ignorecase'`의 경우 대/소문자를 구분하지 않습니다.  
Amazon Redshift 테이블의 열 이름은 항상 소문자이기 때문에 `'auto'` 옵션을 사용할 때는 일치하는 필드 이름 역시 소문자가 되어야 합니다. 필드 이름이 모두 소문자가 아닌 경우 `'auto ignorecase'` 옵션을 사용할 수 있습니다. 기본 `'auto'` 인수를 사용하면 COPY는 구조에서 첫 번째 수준의 필드 또는 *외부 필드*만 인식합니다.  
열 이름을 Avro 필드 이름에 명시적으로 매핑하려면 [JSONPaths 파일](#copy-json-jsonpaths)를 사용합니다.  
기본적으로 COPY는 대상 테이블의 모든 열을 Avro 필드 이름과 일치시키려고 합니다. 열의 하위 집합까지 로드하려면 옵션으로 열 목록을 지정할 수도 있습니다. 대상 테이블의 열이 열 목록에서 빠져있으면 COPY가 대상 열의 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 표현식을 로드합니다. 대상 열에 기본값이 없으면 COPY가 NULL을 로드하려고 합니다. 열 목록에 임의의 열이 포함되어 있다고 할 때 COPY가 Avro 데이터에서 일치하는 필드를 찾지 못할 경우에는 COPY가 해당 열에 NULL을 로드하려고 합니다.  
NOT NULL로 정의된 열에 COPY가 NULL을 할당하려고 하면 COPY 명령이 실패합니다.  
<a name="copy-avro-schema"></a>**Avro 스키마**  
Avro 원본 데이터 파일에는 데이터 구조를 정의하는 스키마가 저장되어 있습니다. COPY는 Avro 원본 데이터 파일에 저장된 스키마를 읽어서 데이터 요소를 대상 테이블 열에 매핑합니다. 다음은 Avro 스키마의 예입니다.  

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"}]
}
```
Avro 스키마는 JSON 형식으로 정의됩니다. 최상위 JSON 객체에는 이름, 즉 *키*가 포함된 이름-값 페어 3개인 `"name"`, `"type"` 및 `"fields"`가 있습니다.  
`"fields"` 키는 데이터 구조에서 각 필드의 이름과 데이터 형식을 정의하는 객체 배열과 쌍을 이룹니다. 기본적으로 COPY는 필드 이름을 열 이름과 자동으로 일치시킵니다. 열 이름은 항상 소문자이므로 `‘auto ignorecase’` 옵션을 지정하지 않는 한 일치하는 필드 이름도 소문자여야 합니다. 열 이름과 일치하지 않는 필드 이름은 모두 무시됩니다. 순서는 중요하지 않습니다. 위의 예에서는 COPY가 열 이름 `id`, `guid`, `name` 및 `address`에 매핑하고 있습니다.  
기본값인 `'auto'` 인수를 사용하면 COPY가 첫 번째 레벨의 객체만 열과 일치시킵니다. 스키마에서 더욱 깊숙한 레벨까지 매핑하려면, 혹은 필드 이름과 열 이름이 일치하지 않는 경우에는 JSONPaths 파일을 사용하여 매핑을 정의할 수 있습니다. 자세한 내용은 [JSONPaths 파일](#copy-json-jsonpaths) 섹션을 참조하세요.  
키와 연결된 값이 바이트, 배열, 레코드, 맵 또는 링크 같이 복잡한 Avro 데이터 형식인 경우에는 COPY가 이 값을 문자열로 로드합니다. 여기서 문자열은 데이터의 JSON 표현입니다. 열거형(enum)인 Avro 데이터 형식은 COPY에서 문자열로 로드되며, 이때 열거되는 내용은 형식 이름입니다. 문제 해결 예는 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md)을(를) 참조하세요.  
스키마와 파일 메타데이터가 저장되는 Avro 파일 헤더의 최대 크기는 1MB입니다.    
단일 Avro 데이터 블록의 최대 크기는 4MB입니다. 이는 최대 행 크기와는 완전히 다릅니다. 단일 Avro 데이터 블록의 최대 크기를 초과하면 이에 따른 행 크기가 최댓값인 4MB보다 작더라도 COPY 명령이 중단됩니다.  
Amazon Redshift가 행 크기를 계산할 때는 내부적으로 파이프 문자(\$1)를 두 번 계산합니다. 따라서 입력 데이터에 파이프 문자가 다수 포함되어 있으면 데이터 블록이 4MB 미만이더라도 행 크기가 4MB를 초과할 수도 있습니다.

JSON [AS] '*json\$1option*'  <a name="copy-json"></a>
원본 데이터가 JSON 형식입니다.  
JSON 형식은 다음과 같은 서비스 및 프로토콜을 통해 COPY에 지원됩니다.  
+ Amazon S3
+ Amazon EMR에서 COPY
+ SSH 연결을 통한 COPY
JSON은 DynamoDB를 통한 COPY에서는 지원되지 않습니다.  
*json\$1option*의 유효 값은 다음과 같습니다.  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
+ `'noshred'` 
기본값은 `'auto'`입니다. Amazon Redshift는 JSON 문서를 로드하는 동안 JSON 구조의 속성을 여러 열로 나누지 않습니다.  
기본적으로 COPY는 대상 테이블의 모든 열을 JSON 필드 이름 키와 일치시키려고 합니다. 열의 하위 집합까지 로드하려면 옵션으로 열 목록을 지정할 수도 있습니다. JSON 필드 이름 키가 모두 소문자가 아닌 경우에도 `'auto ignorecase'` 옵션이나 [JSONPaths 파일](#copy-json-jsonpaths)를 사용하여 열 이름을 명시적으로 JSON 필드 이름 키로 매핑할 수 있습니다.  
대상 테이블의 열이 열 목록에서 빠져있으면 COPY가 대상 열의 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 표현식을 로드합니다. 대상 열에 기본값이 없으면 COPY가 NULL을 로드하려고 합니다. 열 목록에 임의의 열이 포함되어 있다고 할 때 COPY가 JSON 데이터에서 일치하는 필드를 찾지 못할 경우에는 COPY가 해당 열에 NULL을 로드하려고 합니다.  
NOT NULL로 정의된 열에 COPY가 NULL을 할당하려고 하면 COPY 명령이 실패합니다.  
COPY는 JSON 원본 데이터의 데이터 요소를 대상 테이블의 열에 매핑합니다. 이는 원본 이름-값 페어의 *객체 키* 또는 이름을 대상 테이블의 열 이름과 일치시키는 방식으로 수행됩니다.  
각 *json\$1option* 값에 대한 다음 세부 정보를 참조하세요.    
'auto'  <a name="copy-json-auto"></a>
이 옵션을 사용하면 일치에서 대/소문자를 구분합니다. Amazon Redshift 테이블의 열 이름은 항상 소문자이기 때문에 `'auto'` 옵션을 사용할 때는 일치하는 JSON 필드 이름 역시 소문자가 되어야 합니다.  
'auto ignorecase'  <a name="copy-json-auto-ignorecase"></a>
이 옵션을 사용하면 일치에서 대/소문자를 구분하지 않습니다. Amazon Redshift 테이블의 열 이름은 항상 소문자이기 때문에 `'auto ignorecase'` 옵션을 사용할 때는 해당 JSON 필드 이름은 소문자, 대문자 또는 대소문자 혼합일 수 있습니다.  
's3://*jsonpaths\$1file*'  <a name="copy-json-pathfile"></a>
이 옵션을 사용하면 COPY가 여기서 지정하는 JSONPaths 파일을 사용하여 JSON 원본 데이터의 데이터 요소를 대상 테이블의 열에 매핑합니다. *`s3://jsonpaths_file`* 인수는 단일 파일을 명시적으로 참조하는 Amazon S3 객체 키여야 합니다. 예를 들면 `'s3://amzn-s3-demo-bucket/jsonpaths.txt`'입니다. 인수는 키 접두사가 될 수 없습니다. JSONPaths 파일 사용에 대한 자세한 내용은 [JSONPaths 파일](#copy-json-jsonpaths) 섹션을 참조하세요.  
경우에 따라 `jsonpaths_file`로 지정된 파일은 데이터 파일에 대해 `copy_from_s3_objectpath`로 지정된 경로와 동일한 접두사를 갖습니다. 그러면 COPY는 JSONPaths 파일을 데이터 파일로 읽고 오류를 반환합니다. 예를 들어 데이터 파일이 객체 경로 `s3://amzn-s3-demo-bucket/my_data.json`을 사용하고 JSONPaths 파일이 `s3://amzn-s3-demo-bucket/my_data.jsonpaths`라고 가정합니다. 이 경우 COPY는 `my_data.jsonpaths`를 데이터 파일로 로드하려고 합니다.  
'noshred'  <a name="copy-json-noshred"></a>
이 옵션을 사용하면 Amazon Redshift가 JSON 문서를 로드하는 동안 JSON 구조의 속성을 여러 열로 나누지 않습니다.

## JSON 데이터 파일
<a name="copy-json-data-file"></a>

JSON 데이터 파일에는 객체 또는 배열 집합이 저장됩니다. COPY는 저장되어 있는 JSON 객체 또는 배열을 각각 대상 테이블의 행 하나로 로드합니다. 행으로 로드되는 객체 또는 배열은 각각 독립된 루트 레벨 구조이어야 합니다. 즉 다른 JSON 구조의 멤버가 되어서는 안됩니다.

JSON *객체*는 중괄호(\$1 \$1)로 시작해서 끝나며 이름-값 페어 집합이 순서에 상관없이 포함되어 있습니다. 쌍을 이루는 이름과 값은 각각 콜론으로 구분되며, 페어는 서로 쉼표로 구분됩니다. 기본적으로 이름-값 페어에서 *객체 키* 또는 이름은 테이블의 해당 열 이름과 일치해야 합니다. Amazon Redshift 테이블의 열 이름은 항상 소문자이기 때문에 일치하는 JSON 필드 이름 키 역시 소문자가 되어야 합니다. 열 이름과 JSON 키가 일치하지 않을 때는 [JSONPaths 파일](#copy-json-jsonpaths)을 사용하여 명시적으로 열을 키로 매핑하세요.

JSON 객체의 순서는 중요하지 않습니다. 열 이름과 일치하지 않는 이름은 모두 무시됩니다. 다음은 간단한 JSON 객체의 구조를 나타낸 예입니다.

```
{
  "column1": "value1",
  "column2": value2,
  "notacolumn" : "ignore this value"
}
```

JSON *배열*은 대괄호([ ])로 시작해서 끝나며 쉼표로 구분된 값 집합이 순서에 따라 포함되어 있습니다. 데이터 파일이 배열을 사용하는 경우에는 JSONPaths 파일을 지정하여 값과 열을 일치시켜야 합니다. 다음은 간단한 JSON 배열의 구조를 나타낸 예입니다.

```
["value1", value2]
```

JSON은 올바른 형식을 따라야 합니다. 예를 들어 객체나 배열은 공백을 제외하고 쉼표나 기타 다른 문자로 구분할 수 없습니다. 문자열은 큰따옴표로 묶어야 합니다. 인용 부호는 기울어진 인용 부호나 "스마트" 인용 부호가 아닌 단순 인용 부호(0x22)가 되어야 합니다.

중괄호 또는 대괄호를 포함하여 단일 JSON 객체 및 배열의 최대 크기는 4MB입니다. 이는 최대 행 크기와는 완전히 다릅니다. 단일 JSON 객체 또는 배열의 최대 크기를 초과하면 이에 따른 행 크기가 최댓값인 4MB보다 작더라도 COPY 명령이 중단됩니다.

Amazon Redshift가 행 크기를 계산할 때는 내부적으로 파이프 문자(\$1)를 두 번 계산합니다. 따라서 입력 데이터에 파이프 문자가 다수 포함되어 있으면 객체 크기가 4MB 미만이더라도 행 크기가 4MB를 초과할 수도 있습니다.

COPY는 줄 바꿈 문자로 `\n`을, 그리고 탭 문자로 `\t`를 로드합니다. 백슬래시를 로드하려면 백슬래시(`\\`)로 이스케이프하세요.

COPY는 지정한 JSON 원본에서 올바른 형식의 유효 JSON 객체 또는 배열을 검색합니다. COPY가 사용 가능한 JSON 구조를 찾기 전에 또는 유효한 JSON 객체 또는 배열 사이에서 공백이 아닌 문자를 발견하면 COPY는 각 인스턴스에 대해 오류를 반환합니다. 이러한 오류는 MAXERROR 오류로 가산되며, 오류 수가 MAXERROR와 같거나 이를 초과하면 COPY는 중단됩니다.

Amazon Redshift는 STL\$1LOAD\$1ERRORS 시스템 테이블의 행에 오류를 일일이 기록합니다. LINE\$1NUMBER 열에는 오류를 일으킨 JSON 객체의 마지막 라인이 기록됩니다.

IGNOREHEADER를 지정하면 COPY가 지정한 만큼 JSON 데이터의 라인 수를 무시합니다. JSON 데이터의 줄 바꿈 문자도 항상 IGNOREHEADER 계산에 포함됩니다.

COPY는 기본적으로 빈 문자열을 빈 필드의 형태로 로드합니다. 이때 EMPTYASNULL을 지정하면 COPY가 CHAR 및 VARCHAR 필드의 빈 문자열을 NULL로 로드합니다. INT 같이 다른 데이터 형식의 빈 문자열은 항상 NULL로 로드됩니다.

다음 옵션은 JSON에서 지원되지 않습니다.
+ CSV
+ DELIMITER 
+ ESCAPE
+ FILLRECORD 
+ FIXEDWIDTH
+ IGNOREBLANKLINES
+ NULL AS
+ READRATIO
+ REMOVEQUOTES 

자세한 내용은 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md) 섹션을 참조하세요. JSON 데이터 구조에 대한 자세한 내용은 [www.json.org](https://www.json.org/)에서 확인할 수 있습니다.

## JSONPaths 파일
<a name="copy-json-jsonpaths"></a>

JSON 형식 또는 Avro 원본 데이터에서 로드하는 경우에는 기본적으로 COPY가 원본 데이터의 첫 번째 수준 데이터 요소를 대상 테이블의 열에 매핑합니다. 이는 이름-값 페어의 각 이름 또는 객체 키를 대상 테이블의 열 이름과 일치시키는 방식으로 수행됩니다.

열 이름과 객체 키가 일치하지 않는 경우, 혹은 데이터 계층에서 더욱 깊숙한 레벨까지 매핑하려면 JSONPaths 파일을 사용하여 JSON 또는 Avro 데이터 요소를 명시적으로 열까지 매핑할 수 있습니다. JSONPaths 파일은 대상 테이블 또는 열 목록의 열 순서를 일치시켜 JSON 데이터 요소를 열로 매핑합니다.

JSONPaths 파일에는 배열이 아닌 단일 JSON 객체만 저장되어야 합니다. JSON 객체는 이름-값 페어입니다. 이름-값 페어에서 이름에 해당하는 *객체 키*는 `"jsonpaths"`가 되어야 합니다. 이름-값 페어에서 *값*은 *JSONPath 표현식*의 배열입니다. JSONPath 표현식은 각각 JSON 데이터 계층 또는 Avro 스키마의 단일 요소를 참조합니다. 이는 XPath 표현식이 XML 문서의 요소를 참조하는 방식과 비슷합니다. 자세한 내용은 [JSONPath 표현식](#copy-json-jsonpath-expressions) 섹션을 참조하세요.

JSONPaths 파일을 사용하려면 COPY 명령에 JSON 또는 AVRO 키워드를 추가합니다. 다음 형식을 사용하여 JSONPaths 파일의 S3 버킷 이름과 객체 경로를 지정합니다.

```
COPY tablename 
FROM 'data_source' 
CREDENTIALS 'credentials-args' 
FORMAT AS { AVRO | JSON } 's3://jsonpaths_file';
```

`s3://jsonpaths_file` 값은 `'s3://amzn-s3-demo-bucket/jsonpaths.txt'`와 같은 단일 파일을 명시적으로 참조하는 Amazon S3 객체 키여야 합니다. 키 접두사일 수 없습니다.

경우에 따라 경우에 따라 Amazon S3에서 로드하는 경우 `jsonpaths_file`로 지정된 파일은 데이터 파일에 대해 `copy_from_s3_objectpath`로 지정된 경로와 동일한 접두사를 갖습니다. 그러면 COPY는 JSONPaths 파일을 데이터 파일로 읽고 오류를 반환합니다. 예를 들어 데이터 파일이 객체 경로 `s3://amzn-s3-demo-bucket/my_data.json`을 사용하고 JSONPaths 파일이 `s3://amzn-s3-demo-bucket/my_data.jsonpaths`라고 가정합니다. 이 경우 COPY는 `my_data.jsonpaths`를 데이터 파일로 로드하려고 합니다.

 키 이름이 `"jsonpaths"`가 아닌 다른 문자열이라면 COPY 명령이 오류를 반환하지는 않습니다. 하지만 *jsonpaths\$1file*을 무시하고 `'auto'` 인수를 사용합니다.

다음 중 한 가지라도 발생하면 COPY 명령이 중단됩니다.
+ JSON 형식이 잘못된 경우
+ JSON 객체가 2개 이상인 경우
+ 공백을 제외한 문자가 객체 외부에 존재하는 경우
+ 배열 요소가 빈 문자열이거나, 혹은 문자열이 아닌 경우

JSONPaths 파일에는 MAXERROR가 적용되지 않습니다.

[ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 옵션을 지정하더라도 JSONPaths 파일을 암호화해서는 안 됩니다.

자세한 내용은 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md) 섹션을 참조하세요.

## JSONPath 표현식
<a name="copy-json-jsonpath-expressions"></a>

JSONPaths 파일은 JSONPath 표현식을 사용하여 데이터 필드를 대상 열로 매핑합니다. 각 JSONPath 표현식은 Amazon Redshift 대상 테이블의 열 하나에 해당합니다. JSONPath 배열 요소의 순서는 대상 테이블의 열 순서와, 혹은 열 목록을 사용하는 경우 열 목록의 열 순서와 일치해야 합니다.

표시된 대로 필드 이름과 값 모두에 큰따옴표가 필요하며, 기울어진 따옴표나 "스마트" 따옴표가 아닌 단순한 따옴표(0x22)여야 합니다.

JSONPath 표현식에서 참조하는 객체 요소가 JSON 데이터에서 발견되지 않으면 COPY가 NULL 값을 로드하려고 합니다. 참조 객체의 형식이 잘못되면 COPY가 로드 오류를 반환합니다.

JSONPath 표현식에서 참조하는 배열 요소가 JSON 또는 Avro 데이터에서 발견되지 않으면 COPY가 다음 오류와 함께 중단됩니다. `Invalid JSONPath format: Not an array or index out of range.` 이때 원본 데이터에 존재하지 않는 배열 요소는 JSONPaths에서 모두 제거한 후 원본 데이터의 배열이 올바른 형식인지 확인하세요.  

JSONPath 표현식은 대괄호 또는 점 표기법을 사용할 수 있지만 표기법을 혼용할 수는 없습니다. 다음은 대괄호 표기법을 사용한 JSONPath 표현식 예입니다.

```
{
    "jsonpaths": [
        "$['venuename']",
        "$['venuecity']",
        "$['venuestate']",
        "$['venueseats']"
    ]
}
```

다음은 점 표기법을 사용한 JSONPath 표현식 예입니다.

```
{
    "jsonpaths": [
        "$.venuename",
        "$.venuecity",
        "$.venuestate",
        "$.venueseats"
    ]
}
```

Amazon Redshift COPY 구문 컨텍스트에서 JSONPath 표현식은 JSON 또는 Avro 계층적 데이터 구조의 단일 이름 요소에 대한 명시적 경로를 지정해야 합니다. Amazon Redshift는 모호한 경로 또는 여러 이름 요소로 해석될 수 있는 와일드카드 문자 또는 필터 표현식과 같은 JSONPath 요소를 지원하지 않습니다.

자세한 내용은 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md) 섹션을 참조하세요.

## Avro 데이터의 JSONPaths 사용
<a name="using-jsonpath-with-avro"></a>

다음은 다중 레벨의 Avro 스키마를 나타낸 예입니다.

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "isActive", "type": "boolean"},
        {"name": "age", "type": "int"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"},
        {"name": "latitude", "type": "double"},
        {"name": "longitude", "type": "double"},
        {
            "name": "tags",
            "type": {
                        "type" : "array",
                        "name" : "inner_tags",
                        "items" : "string"
                    }
        },
        {
            "name": "friends",
            "type": {
                        "type" : "array",
                        "name" : "inner_friends",
                        "items" : {
                                    "name" : "friends_record",
                                    "type" : "record",
                                    "fields" : [
                                                 {"name" : "id", "type" : "int"},
                                                 {"name" : "name", "type" : "string"}
                                               ]
                                  }
                    }
        },
        {"name": "randomArrayItem", "type": "string"}
    ]
}
```

다음은 AvroPath 표현식을 사용하여 위의 스키마를 참조하는 JSONPaths 파일의 예입니다.

```
{
    "jsonpaths": [
        "$.id",
        "$.guid",
        "$.address",
        "$.friends[0].id"
    ]
}
```

위의 JSONPaths 예에는 다음과 같은 요소가 포함되어 있습니다.

jsonpaths  
AvroPath 표현식이 포함된 JSON 객체의 이름입니다.

[ … ]  
경로 요소가 포함된 JSON 배열을 묶는 대괄호입니다.

\$1  
Avro 스키마에서 `"fields"` 배열에 해당하는 루트 요소를 참조하는 달러 기호입니다.

"\$1.id",  
AvroPath 표현식의 대상입니다. 위 예에서 대상은 `"fields"` 배열에서 이름으로 `"id"`가 포함된 요소입니다. 표현식은 쉼표로 구분됩니다.

"\$1.friends[0].id"  
대괄호는 배열 인덱스를 나타냅니다. JSONPath 표현식은 0부터 시작되는 인덱싱을 사용하기 때문에 이 표현식에서는 `"friends"` 배열에서 이름으로 `"id"`가 포함된 첫 번째 요소를 참조합니다.

Avro 스키마 구문에서는 *안쪽 필드*를 사용하여 레코드 및 배열 데이터 형식의 구조를 정의해야 합니다. AvroPath 표현식에서는 안쪽 필드가 무시됩니다. 예를 들어 `"friends"` 필드는 `"inner_friends"`라는 이름의 배열을 정의하고, 이 배열은 `"friends_record"`라는 이름의 레코드를 정의합니다. `"id"` 필드를 참조하는 AvroPath 표현식은 추가되는 필드를 무시하고 대상 필드를 직접 참조할 수 있습니다. 다음은 `"friends"` 배열에 속한 두 필드를 참조하는 AvroPath 표현식입니다.

```
"$.friends[0].id"
"$.friends[0].name"
```

## 열 기반 데이터 형식 파라미터
<a name="copy-parameters-columnar-data"></a>

COPY는 표준 데이터 형식 외에도 Amazon S3에서 COPY를 실행할 때 다음과 같은 열 기반 데이터 형식을 지원합니다. 열 기반 형식에 대한 COPY는 지원되지만 특정 제한이 따릅니다. 자세한 내용은 [열 기반 데이터 형식에서 COPY 명령](copy-usage_notes-copy-from-columnar.md) 섹션을 참조하세요.

ORC  <a name="copy-orc"></a>
ORC(Optimized Row Columnar) 파일 형식을 사용하는 파일에서 데이터를 불러옵니다.

PARQUET  <a name="copy-parquet"></a>
Parquet 파일 형식을 사용하는 파일에서 데이터를 불러옵니다.

# 파일 압축 파라미터
<a name="copy-parameters-file-compression"></a>

다음 파라미터를 지정하여 압축된 데이터 파일로부터 로드할 수 있습니다.파일 압축 파라미터

bzip2   <a name="copy-bzip2"></a>
입력 파일이 bzip2 압축 형식(.bz2 파일)을 따르도록 지정하는 값입니다. COPY 작업은 데이터를 로드할 때 각 압축 파일을 읽고 데이터 압축을 풉니다.

GZIP   <a name="copy-gzip"></a>
입력 파일이 gzip 압축 형식(.gz 파일)을 따르도록 지정하는 값입니다. COPY 작업은 데이터를 로드할 때 각 압축 파일을 읽고 데이터 압축을 풉니다.

LZOP   <a name="copy-lzop"></a>
입력 파일이 lzop 압축 형식(.lzo 파일)을 따르도록 지정하는 값입니다. COPY 작업은 데이터를 로드할 때 각 압축 파일을 읽고 데이터 압축을 풉니다.  
COPY는 lzop *--filter* 옵션을 사용한 압축 파일을 지원하지 않습니다.

ZSTD   <a name="copy-zstd"></a>
입력 파일이 Zstandard 압축 형식(.zst 파일)을 따르도록 지정하는 값입니다. COPY 작업은 데이터를 로드할 때 각 압축 파일을 읽고 데이터 압축을 풉니다.  
ZSTD는 Amazon S3에서 COPY에서만 지원됩니다.

# 데이터 변환 파라미터
<a name="copy-parameters-data-conversion"></a>

COPY 명령은 테이블에 데이터를 로드할 때 원본 데이터의 문자열을 묵시적으로 대상 열의 데이터 형식으로 변환합니다. 기본 동작과 다른 변환을 지정해야 하거나, 혹은 기본 변환이 오류를 일으킬 때는 다음 파라미터를 지정하여 데이터 변환을 관리할 수 있습니다. 이러한 파라미터 구문에 대한 자세한 내용은 [COPY 구문](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html#r_COPY-syntax)을 참조하세요.
+ [ACCEPTANYDATE](#copy-acceptanydate) 
+ [ACCEPTINVCHARS](#copy-acceptinvchars) 
+ [BLANKSASNULL](#copy-blanksasnull) 
+ [DATEFORMAT](#copy-dateformat) 
+ [EMPTYASNULL](#copy-emptyasnull) 
+ [ENCODING](#copy-encoding) 
+ [ESCAPE](#copy-escape) 
+ [EXPLICIT_IDS](#copy-explicit-ids) 
+ [FILLRECORD](#copy-fillrecord) 
+ [IGNOREBLANKLINES](#copy-ignoreblanklines) 
+ [IGNOREHEADER](#copy-ignoreheader) 
+ [NULL AS](#copy-null-as) 
+ [REMOVEQUOTES](#copy-removequotes) 
+ [ROUNDEC](#copy-roundec) 
+ [TIMEFORMAT](#copy-timeformat) 
+ [TRIMBLANKS](#copy-trimblanks) 
+ [TRUNCATECOLUMNS](#copy-truncatecolumns) <a name="copy-data-conversion-parameters"></a>데이터 변환 파라미터

ACCEPTANYDATE   <a name="copy-acceptanydate"></a>
`00/00/00 00:00:00` 같이 잘못된 형식을 포함하여 모든 데이터 형식을 오류 없이 로드할 수 있도록 허용합니다. 이 파라미터는 TIMESTAMP 및 DATE 열에만 적용됩니다. ACCEPTANYDATE는 항상 DATEFORMAT 파라미터와 함께 사용합니다. 데이터의 날짜 형식이 DATEFORMAT 명세와 일치하지 않는 경우에는 Amazon Redshift가 NULL 값을 해당 필드에 삽입합니다.

ACCEPTINVCHARS [AS] ['*replacement\$1char*']   <a name="copy-acceptinvchars"></a>
데이터에 잘못된 UTF-8 문자가 포함되어 있어도 VARCHAR 열에 데이터를 로드할 수 있습니다. ACCEPTINVCHARS를 지정하면 COPY가 잘못된 UTF-8 문자를 각각 *replacement\$1char*에서 지정하는 문자로 구성된, 동일한 길이의 문자열로 변경합니다. 예를 들어 변경 문자가 '`^`'라면 잘못된 3바이트 문자는 '`^^^`'로 변경됩니다.  
 변경 문자는 NULL을 제외한 모든 ASCII 문자가 될 수 있습니다. 기본 문자는 물음표(?)입니다. 잘못된 UTF-8 문자에 대한 자세한 내용은 [멀티바이트 문자 로드 오류](multi-byte-character-load-errors.md) 섹션을 참조하세요.  
COPY는 잘못된 UTF-8 문자가 포함된 행의 수를 반환한 후 해당하는 행마다 [STL\$1REPLACEMENTS](r_STL_REPLACEMENTS.md) 시스템 테이블에 항목을 추가합니다. 이때 각 노드 조각에서 항목이 추가되는 행의 최대 수는 100개입니다. 이후 추가되는 잘못된 UTF-8 문자 역시 변경되지만 이러한 문자의 변경 이벤트는 기록되지 않습니다.  
ACCEPTINVCHARS를 지정하지 않으면 COPY가 잘못된 UTF-8 문자를 발견할 때마다 오류를 반환합니다.  
ACCEPTINVCHARS는 VARCHAR 열에서만 유효합니다.

BLANKSASNULL   <a name="copy-blanksasnull"></a>
공백 문자로만 구성된 빈 필드를 NULL로 로드합니다. 이 옵션은 CHAR 및 VARCHAR 열에만 적용됩니다. INT 같이 다른 데이터 형식의 빈 필드는 항상 NULL로 로드됩니다. 예를 들어 공백 문자 3개가 다른 문자 없이 연이어 포함된 문자열은 NULL로 로드됩니다. 이 옵션을 사용하지 않으면 기본 동작으로 공백 문자를 있는 그대로 로드합니다.

DATEFORMAT [AS] \$1'*dateformat\$1string*' \$1 'auto' \$1  <a name="copy-dateformat"></a>
인수를 지정하지 않을 경우 기본값은 `'YYYY-MM-DD'`입니다. 예를 들어 이를 대신할 수 있는 유효 형식은 `'MM-DD-YYYY'`입니다.  
COPY 명령이 날짜 또는 시간 값의 형식을 인식하지 못하거나, 혹은 날짜 또는 시간 값이 다른 형식인 경우에는 DATEFORMAT 또는 TIMEFORMAT 파라미터에 `'auto'` 인수를 사용하세요. `'auto'` 인수는 DATEFORMAT 및 TIMEFORMAT 문자열 사용 시 지원되지 않는 몇 가지 형식을 인식합니다. `'auto'`' 키워드는 대/소문자를 구분합니다. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md) 섹션을 참조하세요.  
날짜 형식에 시간 정보(시, 분, 초)가 포함될 수는 있지만 이 정보는 무시됩니다. AS 키워드는 옵션입니다. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 문자열예제](r_DATEFORMAT_and_TIMEFORMAT_strings.md) 섹션을 참조하세요.

EMPTYASNULL   <a name="copy-emptyasnull"></a>
Amazon Redshift가 비어있는 CHAR 및 VARCHAR 필드를 NULL로 로드하도록 지정합니다. INT 같이 다른 데이터 형식의 빈 필드는 항상 NULL로 로드됩니다. 빈 필드는 2개의 구분자가 사이에 아무런 문자도 없이 연이어 데이터에 포함되어 있을 때 발생합니다. EMPTYASNULL과 NULL AS '' (empty string)는 동작이 동일합니다.

ENCODING [AS] *file\$1encoding*  <a name="copy-encoding"></a>
로드 데이터의 인코딩 유형을 지정합니다. COPY 명령은 로딩 도중 데이터를 지정된 인코딩에서 UTF-8로 변환합니다.  
*file\$1encoding*의 유효 값은 다음과 같습니다.  
+ `UTF8`
+ `UTF16`
+ `UTF16LE`
+ `UTF16BE`
+ `ISO88591`
기본값은 `UTF8`입니다.  
원본 파일 이름은 UTF-8 인코딩을 사용해야 합니다.  
다음 파일은 로드 데이터로 다른 인코딩이 지정되어 있더라도 UTF-8 인코딩을 사용해야 합니다.  
+ 매니페스트 파일
+ JSONPaths 파일
다음 파라미터와 함께 입력되는 인수 문자열은 UTF-8을 사용해야 합니다.  
+ FIXEDWIDTH '*fixedwidth\$1spec*'
+ ACCEPTINVCHARS '*replacement\$1char*'
+ DATEFORMAT '*dateformat\$1string*'
+ TIMEFORMAT '*timeformat\$1string*'
+ NULL AS '*null\$1string*'
고정 폭 데이터 파일은 UTF-8 인코딩을 사용해야 합니다. 필드 폭은 바이트 수가 아니라 문자 수를 기준으로 하기 때문입니다.  
로드 데이터는 모두 지정된 인코딩을 사용해야 합니다. COPY가 다른 인코딩을 만나면 파일을 건너뛰고 오류를 반환합니다.  
`UTF16`을 지정한 경우에는 데이터에 바이트 순서 표식(BOM)이 있어야 합니다. UTF-16 데이터가 리틀 엔디안(LE)인지, 빅 엔디안(BE)인지 알고 있다면 BOM 유무에 상관없이 `UTF16LE` 또는 `UTF16BE`를 사용할 수 있습니다.  
ISO-8859-1 인코딩을 사용하려면 `ISO88591`을 지정합니다. 자세한 내용은 **Wikipedia의 [ISO/IEC 8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1)을 참조하세요.

ESCAPE   <a name="copy-escape"></a>
이 파라미터를 지정하면 입력 데이터의 백슬래시 문자(`\`)가 이스케이프 문자로 처리됩니다. 그러면 백슬래시 문자 바로 뒤에 있는 문자가 일반적으로 특정 용도로 사용되는 문자라고 해도 현재 열 값의 일부로 테이블에 로드됩니다. 예를 들어 이 파라미터를 사용하여 구분자 문자, 인용 부호, 줄 바꿈 문자 또는 이스케이프 문자 자체를 이스케이프 처리할 수 있습니다. 단, 이러한 문자가 모두 열 값에서 유효해야 합니다.  
ESCAPE 파라미터를 REMOVEQUOTES 파라미터와 함께 지정하면 그 외에 삭제될 수도 있는 인용 부호(`'` 또는 `"`)를 이스케이프 처리하여 유지할 수 있습니다. 기본 NULL 문자열인 `\N`은 있는 그대로 유효하지만 입력 데이터에서는 `\\N`로 이스케이프 처리할 수도 있습니다. NULL AS 파라미터를 사용해 대체 NULL 문자열을 지정하지만 않는다면 `\N`과 `\\N`은 동일한 결과를 산출합니다.  
제어 문자 `0x00`(NUL)은 이스케이프 처리할 수 없기 때문에 입력 데이터에서 삭제하거나, 혹은 변환해야 합니다. 이 문자는 레코드 끝(EOR) 마커로 처리되어 나머지 레코드는 모두 잘립니다.
FIXEDWIDTH 로드 시 ESCAPE 파라미터를 사용할 수 없으며, 이스케이프 문자 자체를 지정하는 것도 안 됩니다. 이스케이프 문자는 항상 백슬래시 문자입니다. 또한 입력 데이터에는 적절한 자리에 이스케이프 문자가 포함되어야 합니다.  
여기 몇 가지 입력 데이터를 비롯해 ESCAPE 파라미터를 지정했을 때 로드되는 데이터의 예가 있습니다. 행 4의 결과는 REMOVEQUOTES 파라미터 역시 지정된다는 것을 가정합니다. 입력 데이터는 다음과 같이 파이프로 구분된 필드 2개로 구성됩니다.  

```
1|The quick brown fox\[newline]
jumped over the lazy dog.
2| A\\B\\C
3| A \| B \| C
4| 'A Midsummer Night\'s Dream'
```
열 2로 로드되는 데이터는 다음과 같습니다.  

```
The quick brown fox
jumped over the lazy dog.
A\B\C
A|B|C
A Midsummer Night's Dream
```
로드 시 입력 데이터에 대한 이스케이프 문자의 적용 여부는 사용자에게 책임이 있습니다. 이러한 요건의 한 가지 예외라면 이전에 ESCAPE 파라미터를 사용해 언로드되었던 데이터를 다시 로드할 때입니다. 이때는 데이터에 이미 필요한 이스케이프 문자가 포함되어 있기 때문입니다.
ESCAPE 파라미터는 8진수, 16진수, Unicode 또는 기타 이스케이프 시퀀스 표기법을 해석하지 않습니다. 예를 들어 원본 데이터에 8진수 라인 피드 값(`\012`)이 포함되어 있을 때 ESCAPE 파라미터를 사용해 이 데이터를 로드하려고 하면 Amazon Redshift가 값 `012`를 테이블로 로드하는 동시에 이 값을 이스케이프 처리되는 라인 피드로 해석하지 않습니다.  
Microsoft Windows 플랫폼에서 작성된 데이터의 줄 바꿈 문자를 이스케이프 처리하려면 캐리지 리턴용 하나와 라인 피드용 하나, 총 2개의 이스케이프 문자를 사용해야 할 수도 있습니다. 그 밖에 파일을 로드하기 전에 dos2unix 유틸리티 등을 사용해 캐리지 리턴을 삭제하는 방법도 있습니다.

EXPLICIT\$1IDS   <a name="copy-explicit-ids"></a>
원본 데이터 파일에서 명시적인 값을 사용해 자동 생성된 값을 재정의하려면 IDENTITY 열이 포함된 테이블에서 EXPLICIT\$1IDS를 사용하세요. 명령에 열 목록을 추가하는 경우에는 해당 목록에 이 파라미터를 사용할 IDENTITY 열도 포함되어야 합니다. EXPLICIT\$1IDS 값의 데이터 형식은 CREATE TABLE 정의에서 지정한 IDENTITY 형식과 일치해야 합니다.  
EXPLICIT\$1IDS 옵션을 사용하여 테이블에 대해 COPY 명령을 실행할 때, Amazon Redshift는 테이블에서 IDENTITY 열의 고유성을 확인하지 않습니다.  
열이 GENERATED BY DEFAULT AS IDENTITY로 정의된 경우 복사할 수 있습니다. 값이 새로 생성되거나 입력한 값으로 업데이트됩니다. EXPLICIT\$1IDS 옵션은 필요하지 않습니다. COPY는 자격 증명 하이 워터마크를 업데이트하지 않습니다.  
 EXPLICIT\$1ID를 사용하는 COPY 명령의 예는 [IDENTITY 열의 명시적인 값을 사용한 VENUE 로드](r_COPY_command_examples.md#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column)을 참조하세요.

FILLRECORD   <a name="copy-fillrecord"></a>
서로 인접한 열들이 일부 레코드 끝에서 누락되었을 때도 데이터 파일의 로드를 허용합니다. 누락된 열은 NULL로 로드됩니다. 텍스트 및 CSV 형식의 경우 누락된 열이 VARCHAR 열이면 NULL 대신 길이가 0인 문자열이 로드됩니다. 텍스트 및 CSV에서 VARCHAR 열로 NULL을 로드하려면 EMPTYASNULL 키워드를 지정합니다. NULL 치환은 열 정의가 NULL을 허용할 때만 유효합니다.  
예를 들어 테이블 정의에 NULL을 허용하는 CHAR 열이 4개 포함되어 있고, 레코드에 포함된 값이 `apple, orange, banana, mango`라고 가정한다면 COPY 명령은 `apple, orange` 값만 포함된 레코드를 로드하여 채울 수 있습니다. 이때 누락된 CHAR 값은 NULL 값으로 로드됩니다.

IGNOREBLANKLINES   <a name="copy-ignoreblanklines"></a>
데이터 파일에서 라인 피드만 포함된 빈 라인을 무시하고 로드하지 않습니다.

IGNOREHEADER [ AS ] *number\$1rows*   <a name="copy-ignoreheader"></a>
지정하는 *number\$1rows*를 파일 헤더로 처리하고 로드하지 않습니다. IGNOREHEADER는 병렬 로드에서 모든 파일의 헤더를 건너뛸 때 사용됩니다.

NULL AS '*null\$1string*'  <a name="copy-null-as"></a>
*null\$1string*과 일치하는 필드를 NULL로 로드합니다. 여기에서 *null\$1string*은 어떤 문자열이든 가능합니다. 데이터에 NUL(UTF-8 0000) 또는 이진 0(0x000)으로도 불리는 null 종결자가 포함되어 있으면 COPY는 이를 다른 문자로 취급합니다. 예를 들어 '1' \$1\$1 NUL \$1\$1 '2'를 포함하는 레코드는 길이가 3바이트인 문자열로 복사됩니다. 필드에 NUL만 포함된 경우 NULL AS로 `'\0'` 또는 `'\000'`을 지정(예: `NULL AS '\0'` 또는 `NULL AS '\000'`)하여 null 종결자를 NULL로 바꿀 수 있습니다. 필드에 NUL로 끝나는 문자열이 있을 때 NULL AS를 지정하면 끝에서 NUL과 함께 문자열이 삽입됩니다. *null\$1string* 값에 '\$1n'(줄 바꿈)을 사용하지 않습니다. Amazon Redshift는 줄 구분 기호로 사용하기 위해 '\$1n'을 예약합니다. 기본 *null\$1string*은 `'\N`'입니다.  
NULL을 NOT NULL로 정의된 열에 로드하려고 하면 COPY 명령이 실패합니다.

REMOVEQUOTES   <a name="copy-removequotes"></a>
입력 데이터의 문자열에서 묶고 있는 인용 부호를 제거합니다. 인용 부호 안의 문자는 구분자를 포함하여 모두 유지됩니다. 문자열에 선행하는 작은 또는 큰 따옴표만 있고 후행하는 인용 부호가 없는 경우에는 COPY 명령이 해당 행을 로드하지 못하고 오류를 반환합니다. 다음 표는 인용 부호로 묶인 문자열과 이 옵션으로 로드되는 값의 몇 가지 예를 보여줍니다.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/copy-parameters-data-conversion.html)

ROUNDEC   <a name="copy-roundec"></a>
입력 값의 소수점 자릿수가 열 값의 소수점 자릿수보다 큰 경우 숫자 값을 반올림합니다. 기본적으로 COPY는 열 값의 소수점 자릿수에 맞출 필요가 있을 때 값을 자릅니다. 예를 들어 `20.259` 값을 DECIMAL(8,2) 열에 로드한다고 가정할 때 기본적으로 COPY가 이 값을 `20.25`로 자릅니다. 하지만 ROUNDEC를 지정하면 COPY가 값을 `20.26`으로 반올림합니다. INSERT 명령은 열 값의 소수점 자릿수와 일치시켜야 할 때마다 항상 값을 반올림합니다. 따라서 ROUNDEC 파라미터가 지정된 COPY 명령은 INSERT 명령과 똑같이 동작합니다.

TIMEFORMAT [AS] \$1'*timeformat\$1string*' \$1 'auto' \$1 'epochsecs' \$1 'epochmillisecs' \$1  <a name="copy-timeformat"></a>
시간 형식을 지정합니다. TIMEFORMAT을 지정하지 않았을 때 기본 형식은 TIMESTAMP 열의 경우 `YYYY-MM-DD HH:MI:SS`이고, 그리고 TIMESTAMPTZ 열의 경우 `YYYY-MM-DD HH:MI:SSOF`입니다. 여기에서 `OF`는 협정 세계시(UTC)의 오프셋을 말합니다. *timeformat\$1string*에는 시간대 지정자를 추가할 수 없습니다. 기본 형식과 다른 형식의 TIMESTAMPTZ 데이터를 로드하려면 'auto'를 지정해야 합니다. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md) 섹션을 참조하세요. *timeformat\$1string*에 대한 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 문자열예제](r_DATEFORMAT_and_TIMEFORMAT_strings.md) 섹션을 참조하세요.  
`'auto'` 인수는 DATEFORMAT 및 TIMEFORMAT 문자열 사용 시 지원되지 않는 몇 가지 형식을 인식합니다. COPY 명령이 날짜 또는 시간 값의 형식을 인식하지 못하거나, 혹은 날짜 및 시간 값이 서로 다른 형식인 경우에는 DATEFORMAT 또는 TIMEFORMAT 파라미터에 `'auto'` 인수를 사용하세요. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md) 섹션을 참조하세요.  
원본 데이터가 epoch 시간, 즉 1970년 1월 1일 00:00:00 UTC 이후의 시간(초 또는 밀리초)으로 표현되는 경우에는 `'epochsecs'` 또는 `'epochmillisecs'`를 지정합니다.  
`'auto'`, `'epochsecs'` 및 `'epochmillisecs'` 키워드는 대/소문자를 구분합니다.  
AS 키워드는 옵션입니다.

TRIMBLANKS   <a name="copy-trimblanks"></a>
VARCHAR 문자열에서 후행 공백 문자를 제거합니다. 이 파라미터는 VARCHAR 데이터 형식의 열에만 적용됩니다.

TRUNCATECOLUMNS   <a name="copy-truncatecolumns"></a>
열의 데이터를 열 명세에 따라 적합한 수의 문자로 자릅니다. VARCHAR 또는 CHAR 데이터 형식의 열에만 적용되며, 행의 크기는 4MB 이하입니다.

# 데이터 로드 작업
<a name="copy-parameters-data-load"></a>

문제 해결을 위해, 혹은 로드 시간을 줄일 목적으로 다음 파라미터를 지정하여 로드 작업의 기본 동작을 관리합니다.
+ [COMPROWS](#copy-comprows) 
+ [COMPUPDATE](#copy-compupdate) 
+ [IGNOREALLERRORS](#copy-ignoreallerrors) 
+ [MAXERROR](#copy-maxerror) 
+ [NOLOAD](#copy-noload) 
+ [STATUPDATE](#copy-statupdate) <a name="copy-data-load-parameters"></a>파라미터

COMPROWS *numrows*   <a name="copy-comprows"></a>
압축 분석 시 샘플 크기로 사용할 행의 수를 지정합니다. 분석은 각 데이터 조각의 행에서 실행됩니다. 예를 들어 `COMPROWS 1000000`(1,000,000)을 지정했을 때 시스템에 총 4개의 조각이 있는 경우에는 조각당 250,000개까지만 행을 읽고 분석합니다.  
COMPROWS가 지정되지 않은 경우 샘플 크기는 기본적으로 조각당 100,000개입니다. 기본값인 조각당 100,000개의 행보다 낮은 COMPROWS 값은 자동으로 기본값으로 업그레이드됩니다. 하지만 로드되는 데이터의 크기가 유의적인 샘플을 산출할 정도로 충분하지 않은 경우에는 자동 압축이 일어나지 않습니다.  
COMPROWS 숫자가 입력 파일의 행 개수보다 큰 값이면 COPY 명령이 가능한 모든 행에 대한 압축 분석을 계속 진행하고 실행합니다. 이 인수의 허용 범위는 1000과 2147483647(2,147,483,647) 사이의 수입니다.

COMPUPDATE [ PRESET \$1 \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-compupdate"></a>
COPY 실행 시 압축 인코딩의 자동 적용 여부를 제어합니다.  
COMPUPDATE가 PRESET인 경우 열에 이미 RAW 이외의 다른 인코딩이 있어도 대상 테이블이 비어 있으면 COPY 명령이 각 열에 대한 압축 인코딩을 선택합니다. 현재 지정된 열 인코딩을 바꿀 수 있습니다. 각 열에 대한 인코딩은 열 데이터 형식을 기준으로 합니다. 데이터가 샘플링되지 않습니다. Amazon Redshift가 다음과 같이 압축 인코딩을 자동으로 할당합니다.  
+ 정렬 키로 정의된 열은 RAW 압축이 할당됩니다.
+ BOOLEAN, REAL 또는 DOUBLE PRECISION 데이터 형식으로 정의된 열은 RAW 압축이 할당됩니다.
+ SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIMESTAMP 또는 TIMESTAMPTZ로 정의된 열에는 AZ64 압축이 할당됩니다.
+ CHAR 또는 VARCHAR로 정의된 열에는 LZO 압축이 할당됩니다.
COMPUPDATE가 생략된 경우 COPY 명령은 대상 테이블이 비어 있고 임의의 열에 대한 인코딩(RAW 이외)을 지정하지 않은 경우에만 각 열에 대한 압축 인코딩을 선택합니다. 각 열에 대한 인코딩은 Amazon Redshift에 의해 결정됩니다. 데이터가 샘플링되지 않습니다.  
COMPUPDATE가 ON(또는 TRUE)이거나 옵션 없이 COMPUPDATE가 지정된 경우 테이블 열에 이미 RAW 외에 다른 인코딩이 있어도 테이블이 비어 있으면 COPY 명령이 자동 압축을 적용합니다. 현재 지정된 열 인코딩을 바꿀 수 있습니다. 각 열에 대한 인코딩은 샘플 데이터 분석을 기반으로 합니다. 자세한 내용은 [자동 압축을 사용하여 테이블 로드](c_Loading_tables_auto_compress.md) 섹션을 참조하세요.  
COMPUPDATE가 OFF(또는 FALSE)일 때는 자동 압축이 비활성화됩니다. 열 인코딩은 변경되지 않습니다.  
압축을 분석하는 시스템 테이블에 대한 자세한 내용은 [STL\$1ANALYZE\$1COMPRESSION](r_STL_ANALYZE_COMPRESSION.md) 섹션을 참조하세요.

IGNOREALLERRORS   <a name="copy-ignoreallerrors"></a>
이 옵션을 지정하여 로드 작업 중에 발생하는 모든 오류를 무시할 수 있습니다.  
MAXERROR 옵션을 지정하면 IGNOREALLERRORS 옵션을 지정할 수 없습니다. ORC 및 Parquet를 포함한 열 형식에 대해서는 IGNOREALLERRORS 옵션을 지정할 수 없습니다.

MAXERROR [AS] *error\$1count*   <a name="copy-maxerror"></a>
데이터 로드 시 *error\$1count*를 오류 수 이상으로 반환하면 로드가 중단됩니다. 반환되는 오류 수가 더 적을 때는 로드를 계속하면서 INFO 메시지를 반환하여 로드할 수 없는 행의 수를 알려줍니다. 이 파라미터는 형식 오류 또는 기타 데이터 불일치로 인해 일부 행을 테이블에 로드하지 못할 때 중단 없이 로드를 계속할 수 있도록 지정합니다.  
첫 번째 오류 발생 시 바로 로드를 중단하려면 이 값을 `0` 또는 `1`로 설정하세요. AS 키워드는 옵션입니다. MAXERROR 기본 값은 `0`이며 최대 `100000`까지 설정할 수 있습니다.  
 Amazon Redshift의 병렬 특성 때문에 실제로 보고되는 오류 수는 지정한 MAXERROR 값보다 클 수 있습니다. Amazon Redshift 클러스터 노드에서 MAXERROR 값이 초과된 것을 감지하면 각 노드가 발생하는 모든 오류를 보고합니다.

NOLOAD   <a name="copy-noload"></a>
실제로 데이터를 로드하지 않고 데이터 파일의 유효성을 검사합니다. NOLOAD 파라미터를 사용하면 실제로 데이터를 로드하기 전에 데이터 파일의 로드에 따른 잠재적 오류 여부를 확인할 수 있습니다. COPY를 NOLOAD 파라미터와 함께 실행하면 파일의 구문만 분석하기 때문에 데이터 로드보다 속도가 훨씬 빠릅니다.

STATUPDATE [ \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-statupdate"></a>
COPY 명령을 성공적으로 마치면 옵티마이저 통계를 자동 계산하여 업데이트합니다. 기본적으로 처음부터 빈 테이블이라면 STATUPDATE 파라미터를 사용하지 않아도 통계가 자동 업데이트됩니다.  
데이터를 비어있지 않은 테이블로 수집하면서 테이블 크기의 변동이 심할 때마다 [ANALYZE](r_ANALYZE.md) 명령을 실행하거나, 혹은 STATUPDATE ON 인수를 사용하여 통계를 업데이트하는 것이 좋습니다.  
STATUPDATE ON(또는 TRUE)일 때는 테이블이 처음부터 비어있는지 상관없이 통계가 자동 업데이트됩니다. STATUPDATE를 사용할 경우 현재 사용자가 테이블 소유자이거나 수퍼유저이어야 합니다. 하지만 STATUPDATE를 지정하지 않는 경우에는 사용자에게 INSERT 권한만 있으면 됩니다.  
STATUPDATE OFF(또는 FALSE)일 때는 통계가 업데이트되지 않습니다.  
자세한 내용은 [테이블 분석](t_Analyzing_tables.md) 섹션을 참조하세요.

# 알파벳 순서의 파라미터 목록
<a name="r_COPY-alphabetical-parm-list"></a>

다음은 COPY 명령 파라미터 각각에 대한 설명 링크가 알파벳 순으로 정렬되어 있는 목록입니다.
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate)
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars)
+ [ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id-access)
+ [AVRO](copy-parameters-data-format.md#copy-avro)
+ [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull)
+ [BZIP2](copy-parameters-file-compression.md#copy-bzip2) 
+ [COMPROWS](copy-parameters-data-load.md#copy-comprows)
+ [COMPUPDATE](copy-parameters-data-load.md#copy-compupdate)
+ [CREDENTIALS](copy-parameters-authorization.md#copy-credentials-cred)
+ [CSV](copy-parameters-data-format.md#copy-csv)
+ [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat)
+ [DELIMITER](copy-parameters-data-format.md#copy-delimiter)
+ [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull)
+ [ENCODING](copy-parameters-data-conversion.md#copy-encoding)
+ [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted)
+ [ESCAPE](copy-parameters-data-conversion.md#copy-escape)
+ [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
+ [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth)
+ [FORMAT](copy-parameters-data-format.md#copy-format)
+ [FROM](copy-parameters-data-source-s3.md#copy-parameters-from)
+ [GZIP](copy-parameters-file-compression.md#copy-gzip)
+ [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role-iam)
+ [IGNOREALLERRORS](copy-parameters-data-load.md#copy-ignoreallerrors)
+ [IGNOREBLANKLINES](copy-parameters-data-conversion.md#copy-ignoreblanklines)
+ [IGNOREHEADER](copy-parameters-data-conversion.md#copy-ignoreheader)
+ [JSON format for COPY](copy-parameters-data-format.md#copy-json)
+ [LZOP](copy-parameters-file-compression.md#copy-lzop)
+ [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
+ [MASTER_SYMMETRIC_KEY](copy-parameters-data-source-s3.md#copy-master-symmetric-key)
+ [MAXERROR](copy-parameters-data-load.md#copy-maxerror)
+ [NOLOAD](copy-parameters-data-load.md#copy-noload)
+ [NULL AS](copy-parameters-data-conversion.md#copy-null-as)
+ [READRATIO](copy-parameters-data-source-dynamodb.md#copy-readratio)
+ [REGION](copy-parameters-data-source-s3.md#copy-region)
+ [REMOVEQUOTES](copy-parameters-data-conversion.md#copy-removequotes)
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec)
+ [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token)
+ [SHAPEFILE](copy-parameters-data-format.md#copy-shapefile)
+ [SSH](copy-parameters-data-source-ssh.md#copy-ssh)
+ [STATUPDATE](copy-parameters-data-load.md#copy-statupdate)
+ [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat)
+ [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks)
+ [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns)
+ [ZSTD](copy-parameters-file-compression.md#copy-zstd)

# 사용 노트
<a name="r_COPY_usage_notes"></a>

**Topics**
+ [다른 AWS 리소스에 대한 액세스 권한](copy-usage_notes-access-permissions.md)
+ [Amazon S3 액세스 포인트 별칭과 함께 COPY 사용](copy-usage_notes-s3-access-point-alias.md)
+ [Amazon S3에서 멀티바이트 데이터 로드](copy-usage_notes-multi-byte.md)
+ [GEOMETRY 또는 GEOGRAPHY 데이터 유형의 열 로드](copy-usage_notes-spatial-data.md)
+ [HLLSKETCH 데이터 형식 로드](copy-usage_notes-hll.md)
+ [VARBYTE 데이터 유형의 열 로드](copy-usage-varbyte.md)
+ [다수의 파일을 읽어올 때 발생하는 오류](copy-usage_notes-multiple-files.md)
+ [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md)
+ [열 기반 데이터 형식에서 COPY 명령](copy-usage_notes-copy-from-columnar.md)
+ [DATEFORMAT 및 TIMEFORMAT 문자열](r_DATEFORMAT_and_TIMEFORMAT_strings.md)
+ [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md)

# 다른 AWS 리소스에 대한 액세스 권한
<a name="copy-usage_notes-access-permissions"></a>

 Amazon S3, Amazon DynamoDB, Amazon EMR, Amazon EC2 등의 다른 AWS 리소스와 클러스터 사이에 데이터를 이동시키려면 클러스터에 리소스에 대한 액세스 권한을 비롯해 필요한 작업 권한이 있어야 합니다. 예를 들어 Amazon S3에서 데이터를 로드하려면 COPY에 버킷에 대한 LIST 액세스 권한과 버킷 객체에 대한 GET 액세스 권한이 있어야 합니다. 최소 권한에 대한 자세한 내용은 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](#copy-usage_notes-iam-permissions) 섹션을 참조하세요.

리소스에 대한 액세스 권한을 얻기 위해서는 먼저 클러스터의 인증이 필요합니다. 인증 방법은 다음 중 한 가지를 선택할 수 있습니다.
+ [역할 기반 액세스 제어](#copy-usage_notes-access-role-based) – 역할 기반 액세스 제어에서는 사용자가 클러스터가 인증 및 권한 부여에 사용할 AWS Identity and Access Management(IAM) 역할을 지정합니다. AWS 자격 증명과 민감한 데이터를 보호하려면 역할 기반 인증의 사용을 강력하게 권장합니다.
+ [키 기반 액세스 제어](#copy-usage_notes-access-key-based) – 키 기반 액세스 제어에서는 사용자의 AWS 액세스 자격 증명(액세스 키 ID와 비밀 액세스 키)을 일반 텍스트로 입력합니다.

## 역할 기반 액세스 제어
<a name="copy-usage_notes-access-role-based"></a>

<a name="copy-usage_notes-access-role-based.phrase"></a>역할 기반 액세스 제어를 통해 클러스터는 IAM 역할을 임시로 맡습니다. 그런 다음 역할에 부여되는 권한에 따라 클러스터가 필요한 AWS 리소스에 액세스할 수 있습니다.

AWS에서 자격 증명이 할 수 있는 것과 없는 것을 결정하는 권한 정책을 갖춘 AWS 자격 증명이라는 점에서 IAM *역할* 생성은 사용자에게 권한을 제공하는 것과 유사합니다. 하지만 역할은 사용자 한 명과 독자적으로 연결되는 것이 아니기 때문에 필요한 모든 객체에게 전달할 수 있습니다. 또한 역할과 연결되는 자격 증명(암호 또는 액세스 키)도 전혀 없습니다. 다만 역할이 클러스터와 연결되면 액세스 키가 동적으로 생성되어 클러스터에게 제공됩니다.

역할 기반 액세스 제어는 AWS 자격 증명을 보호하는 것은 물론이고 AWS 리소스와 민감한 사용자 데이터에 대한 액세스를 더욱 안전하게, 그리고 세분화하여 제어할 수 있다는 점에서 더욱 바람직합니다.

역할 기반 인증의 이점은 다음과 같습니다.
+ AWS 표준 IAM 도구를 사용하여 IAM 역할을 정의한 후 다수의 클러스터와 연결할 수 있습니다. 역할 액세스 정책을 수정할 경우에는 변경 사항이 역할을 사용하는 모든 클러스터에 자동 적용됩니다.
+ 특정 클러스터 및 데이터베이스 사용자에게 원하는 AWS 리소스와 작업에 대한 액세스 권한을 부여하는 IAM 정책을 세분화하여 정의할 수 있습니다.
+ 클러스터가 실행 시간에 임시 세션 자격 증명을 가져온 후 작업이 끝날 때까지 필요에 따라 자격 증명을 새롭게 변경합니다. 키 기반 임시 자격 증명을 사용하는 경우에는 작업을 마치기 전에 임시 자격 증명이 만료되면 작업이 중단됩니다.
+ 액세스 키 ID와 보안 액세스 키 ID는 저장되지도 않고 SQL 코드로 전송되지도 않습니다.

역할 기반 액세스 제어를 사용하려면 먼저 Amazon Redshift 서비스 역할 유형을 사용하여 IAM 역할을 생성한 후 클러스터에 연결해야 합니다. 이 역할에는 최소한 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](#copy-usage_notes-iam-permissions)에 나열된 권한이 있어야 합니다. IAM 역할을 생성하여 클러스터에 연결하는 단계는 *Amazon Redshift 관리 가이드*의 [사용자를 대신하여 기타 AWS 서비스에 액세스하도록 Amazon Redshift에 권한 부여](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html) 섹션을 참조하세요.

Amazon Redshift 관리 콘솔, CLI 또는 API를 사용하여 역할을 클러스터에 추가하거나, 클러스터와 연결된 역할을 확인할 수 있습니다. 자세한 내용은 *Amazon Redshift 관리 가이드*의 [클러스터와 IAM 역할 연결](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) 섹션을 참조하세요.

IAM 역할을 생성하면 IAM이 생성된 역할의 Amazon 리소스 이름(ARN)을 반환합니다. IAM 역할을 지정하려면 [IAM\$1ROLE 파라미터 사용](copy-parameters-authorization.md#copy-iam-role) 파라미터 또는 [CREDENTIALS 파라미터 사용](copy-parameters-authorization.md#copy-credentials) 파라미터에 이 역할 ARN을 입력해야 합니다.

예를 들어 클러스터에 다음과 같은 역할이 연결되어 있다고 가정하겠습니다.

```
"IamRoleArn": "arn:aws:iam::0123456789012:role/MyRedshiftRole"
```

다음은 위의 예에서 Amazon S3에 대한 인증 및 액세스를 위해 IAM\$1ROLE 파라미터에 ARN을 사용하는 COPY 명령 예입니다.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata'  
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

다음은 CREDENTIALS 파라미터를 사용하여 IAM 역할을 지정하는 COPY 명령 예입니다.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata' 
credentials 
'aws_iam_role=arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

또한 슈퍼 사용자는 데이터베이스 사용자 및 그룹에 ASSUMEROLE 권한을 부여하여 COPY 작업을 위한 역할에 대한 액세스 권한을 제공할 수 있습니다. 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

## 키 기반 액세스 제어
<a name="copy-usage_notes-access-key-based"></a>

<a name="copy-usage_notes-access-key-based.phrase"></a>키 기반 액세스 제어의 경우 데이터가 포함된 AWS 리소스에 액세스할 권한이 부여된 IAM 사용자에게 액세스 키 ID와 비밀 액세스 키를 제공합니다. [ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터 사용](copy-parameters-authorization.md#copy-access-key-id) 파라미터를 함께 사용하거나 [CREDENTIALS 파라미터 사용](copy-parameters-authorization.md#copy-credentials) 파라미터를 사용할 수 있습니다.

**참고**  
액세스 키 ID와 비밀 액세스 키를 일반 텍스트 형태로 입력하기보다는 IAM 역할을 인증에 사용하는 것을 강력 권장합니다. 키 기반 액세스 제어를 선택하는 경우에는 절대 AWS 계정(루트) 자격 증명을 사용하지 마세요. 항상 IAM 사용자를 먼저 생성한 후 해당 사용자의 액세스 키 ID와 비밀 액세스 키를 입력합니다. IAM 사용자를 생성하는 단계는 [AWS 계정의 IAM 사용자 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)을 참조하세요.

ACCESS\$1KEY\$1ID와 SECRET\$1ACCESS\$1KEY를 사용하여 인증하려면 다음 예와 같이 *<access-key-id>* 및 *<secret-access-key>*에 권한이 부여된 사용자의 액세스 키 ID와 전체 보안 액세스 키를 입력합니다.

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>';
```

CREDENTIALS 파라미터를 사용하여 인증하려면 다음 예와 같이 *<access-key-id>* 및 *<secret-access-key>*에 권한이 부여된 사용자의 액세스 키 ID와 전체 보안 액세스 키를 입력합니다.

```
CREDENTIALS
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>';
```

IAM 사용자는 최소한 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](#copy-usage_notes-iam-permissions)에 나열된 권한이 있어야 합니다.

### 임시 보안 자격 증명
<a name="r_copy-temporary-security-credentials"></a>

 키 기반 액세스 제어를 사용하는 경우에는 임시 보안 자격 증명을 통해 데이터에 대한 사용자 액세스를 추가로 제한할 수 있습니다. 역할 기반 인증은 임시 자격 증명을 자동으로 사용합니다.

**참고**  
임시 자격 증명을 생성하여 액세스 키 ID와 보안 액세스 키를 일반 텍스트 형태로 입력하기보다는 [role-based access control](#copy-usage_notes-access-role-based.phrase)를 사용하는 것이 더욱 바람직합니다. 역할 기반 액세스 제어는 자동으로 임시 자격 증명을 사용합니다.

임시 보안 자격 증명은 유효 기간이 짧고 만료 후 재사용이 불가능하기 때문에 보안을 강화하는 효과가 있습니다. 토큰으로 생성된 액세스 키 ID와 비밀 액세스 키는 토큰 없이 사용할 수 없으며, 이러한 임시 보안 자격 증명이 발급된 사용자는 자격 증명이 만료될 때까지만 리소스에 액세스할 수 있습니다.

사용자에게 리소스에 대한 임시 액세스 권한을 부여할 때는 AWS Security Token Service(AWS STS) API 작업을 호출합니다. AWS STS API 작업은 보안 토큰, 액세스 키 ID 및 보안 액세스 키로 구성된 임시 보안 자격 증명을 반환합니다. 임시 보안 자격 증명은 리소스에 대한 일시적으로 액세스가 필요한 사용자에게 발급합니다. 이러한 사용자들은 기존 IAM 사용자일 수도 있고, 혹은 AWS를 사용하지 않는 사용자일 수도 있습니다. 임시 보안 자격 증명 생성에 대한 자세한 내용은 IAM User Guide의 [Using Temporary Security Credentials](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html) 섹션을 참조하세요.

[ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터 사용](copy-parameters-authorization.md#copy-access-key-id) 파라미터를 [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token) 파라미터 또는 [CREDENTIALS 파라미터 사용](copy-parameters-authorization.md#copy-credentials) 파라미터와 함께 사용할 수 있습니다. 또한 토큰과 함께 제공되는 액세스 키 ID와 보안 액세스 키를 입력해야 합니다.

ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY 및 SESSION\$1TOKEN을 사용하여 인증하려면 다음 예와 같이 *<temporary-access-key-id>*, *<temporary-secret-access-key>*, *<temporary-token>*에 해당하는 자격 증명을 입력합니다.

```
ACCESS_KEY_ID '<temporary-access-key-id>'
SECRET_ACCESS_KEY '<temporary-secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

CREDENTIALS를 사용하여 인증하려면 다음 예와 같이 자격 증명 문자열에 `session_token=<temporary-token>`을 입력합니다.

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>';
```

다음은 임시 보안 자격 증명을 사용하는 COPY 명령 예입니다.

```
copy table-name
from 's3://objectpath'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>';
```

다음은 임시 자격 증명과 파일 암호화를 사용해 LISTING 테이블에 로드하는 예입니다.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>'
master_symmetric_key '<root-key>'
encrypted;
```

다음은 CREDENTIALS 파라미터에서 임시 자격 증명과 파일 암호화를 사용해 LISTING 테이블에 로드하는 예입니다.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt'
credentials 
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>;master_symmetric_key=<root-key>'
encrypted;
```

**중요**  
임시 보안 자격 증명은 COPY 또는 UNLOAD 작업이 완전히 끝날 때까지 유효해야 합니다. 작업 도중 임시 보안 자격 증명이 만료되면 명령 중단과 함께 트랜잭션이 롤백됩니다. 예를 들어 임시 보안 자격 증명이 15분 후 만료되는데 필요한 COPY 작업 시간이 1시간이라면 COPY 작업이 완료 이전에 중단됩니다. 하지만 역할 기반 액세스를 사용하는 경우에는 작업을 마치기 전에 임시 보안 자격 증명이 새롭게 자동 업데이트됩니다.

## COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한
<a name="copy-usage_notes-iam-permissions"></a>

CREDENTIALS 파라미터에서 참조하는 IAM 역할 또는 사용자는 최소한 다음 권한을 가지고 있어야 합니다.
+ Amazon S3에서 COPY의 경우 Amazon S3 버킷에 대한 LIST 및 로드 중인 Amazon S3 객체와 매니페스트 파일(사용 중인 경우)에 대한 GET 권한.
+ JSON 형식 데이터가 있는 Amazon S3, Amazon EMR 및 원격 호스트(SSH)에서 COPY를 지원하는 경우 Amazon S3의 JSONPaths 파일(사용하는 경우)에 대한 LIST 및 GET 권한.
+ DynamoDB에서 COPY의 경우 로드 중인 DynamoDB 테이블에 대한 SCAN 및 DESCRIBE 권한.
+ Amazon EMR 클러스터에서 COPY의 경우 Amazon EMR 클러스터에 대한 `ListInstances` 작업 권한.
+ Amazon S3로 UNLOAD의 경우 데이터 파일을 언로드 중인 Amazon S3 버킷에 대한 GET, LIST 및 PUT 권한.
+ Amazon S3에서 CREATE LIBRARY의 경우 Amazon S3 버킷에 대한 LIST 및 가져오고 있는 Amazon S3 객체에 대한 GET 권한.

**참고**  
COPY, UNLOAD 또는 CREATE LIBRARY 명령 실행 시 오류 메시지로 `S3ServiceException: Access Denied`가 수신되면 클러스터에 Amazon S3에 대한 액세스 권한이 없는 것입니다.

IAM 권한은 클러스터, 사용자 또는 사용자가 속한 그룹에 연결되어 있는 IAM 역할에 IAM 정책을 연결하여 관리할 수 있습니다. 예를 들어 `AmazonS3ReadOnlyAccess` 관리형 정책은 Amazon S3 리소스에 LIST 및 GET 권한을 부여합니다. IAM 정책에 대한 자세한 내용은 *IAM User Guide*의 [Managing IAM Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html) 섹션을 참조하세요.

# Amazon S3 액세스 포인트 별칭과 함께 COPY 사용
<a name="copy-usage_notes-s3-access-point-alias"></a>

COPY는 Amazon S3 액세스 포인트 별칭을 지원합니다. 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [액세스 포인트에 버킷 스타일 별칭 사용](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html)을 참조하세요.

# Amazon S3에서 멀티바이트 데이터 로드
<a name="copy-usage_notes-multi-byte"></a>

데이터에 중국어나 키릴 문자 같이 ASCII가 아닌 멀티바이트 문자가 포함되어 있는 경우에는 VARCHAR 열에 데이터를 로드해야 합니다. VARCHAR 데이터 형식은 4바이트 UTF-8 문자를 지원하지만 CHAR 데이터 형식에서는 1바이트 ASCII 문자만 허용되기 때문입니다. Amazon Redshift 테이블에 5바이트 이상의 문자는 로드할 수 없습니다. 자세한 내용은 [멀티바이트 문자](c_Supported_data_types.md#c_Supported_data_types-multi-byte-characters) 섹션을 참조하세요.

# GEOMETRY 또는 GEOGRAPHY 데이터 유형의 열 로드
<a name="copy-usage_notes-spatial-data"></a>

CSV 파일과 같이 문자로 구분된 텍스트 파일의 데이터에서 `GEOMETRY` 또는 `GEOGRAPHY` 열로 COPY가 가능합니다. 데이터는 잘 알려진 이진 형식(WKB 또는 EWKB) 또는 잘 알려진 텍스트 형식(WKT 또는 EWKT)의 16진수 형식이어야 하며 COPY 명령에 대한 단일 입력 행의 최대 크기에 맞아야 합니다. 자세한 내용은 [COPY](r_COPY.md) 섹션을 참조하세요.

shapefile에서 로드하는 방법에 대한 자세한 내용은 [Amazon Redshift에 shapefile 로드](spatial-copy-shapefile.md) 섹션을 참조하세요.

`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형에 대한 자세한 내용은 [Amazon Redshift에서 공간 데이터 쿼리](geospatial-overview.md)섹션을 참조하세요.

# HLLSKETCH 데이터 형식 로드
<a name="copy-usage_notes-hll"></a>

HLL 스케치는 Amazon Redshift에서 지원하는 희소 또는 밀집 형식으로만 복사할 수 있습니다. HyperLogLog 스케치에서 COPY 명령을 사용하려면 밀접 HyperLogLog 스케치에 Base64 형식을 사용하고 희소 HyperLogLog 스케치에 JSON 형식을 사용합니다. 자세한 내용은 [HyperLogLog 함수](hyperloglog-functions.md) 섹션을 참조하세요.

다음 예에서는 CREATE TABLE 및 COPY를 사용하여 CSV 파일의 데이터를 테이블로 가져옵니다. 먼저 이 예에서는 CREATE TABLE을 사용하여 테이블 `t1`을 생성합니다.

```
CREATE TABLE t1 (sketch hllsketch, a bigint);
```

그런 다음 COPY를 사용하여 CSV 파일의 데이터를 테이블 `t1`로 가져옵니다.

```
COPY t1 FROM s3://amzn-s3-demo-bucket/unload/' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' NULL AS 'null' CSV;
```

# VARBYTE 데이터 유형의 열 로드
<a name="copy-usage-varbyte"></a>

CSV, Parquet, ORC 형식의 파일에서 데이터를 로드할 수 있습니다. CSV의 경우 데이터는 파일에서 VARBYTE 데이터의 16진수 표현으로 로드됩니다. `FIXEDWIDTH` 옵션을 사용하여 VARBYTE 데이터를 로드할 수 없습니다. COPY의 `ADDQUOTES` 또는 `REMOVEQUOTES` 옵션은 지원되지 않습니다. VARBYTE 열은 파티션 열로 사용할 수 없습니다.

# 다수의 파일을 읽어올 때 발생하는 오류
<a name="copy-usage_notes-multiple-files"></a>

COPY 명령은 원자성을 띤 트랜잭션으로 처리됩니다. 다시 말해서 COPY 명령이 다수의 파일에서 데이터를 읽어올 때도 전체 프로세스가 하나의 트랜잭션으로 처리됩니다. COPY가 파일을 읽어오다 오류가 발생하면 프로세스 시간 제한에 이를 때까지([statement\$1timeout](r_statement_timeout.md) 참조) 자동으로 재시도합니다. 또는 Amazon S3에서 장시간(15\$130분) 데이터를 다운로드할 수 없는 경우에도 마찬가지입니다. 따라서 각 파일마다 반드시 단 한 번 로드됩니다. COPY 명령이 실패하면 전체 트랜잭션이 취소되고 모든 변경 사항이 롤백됩니다. 로드 오류 처리에 대한 자세한 내용은 [데이터 로드 문제 해결](t_Troubleshooting_load_errors.md) 섹션을 참조하세요.

COPY 명령이 성공적으로 시작되면 클라이언트가 분리되는 등 세션이 종료되더라도 중단되지 않습니다. 하지만 COPY 명령이 세션 종료로 인해 아직 완료되지 않은 BEGIN … END 트랜잭션 블록 내에서 정체되면 COPY를 포함해 전체 트랜잭션이 롤백됩니다. 버전 관리에 대한 자세한 내용은 [BEGIN](r_BEGIN.md) 섹션을 참조하세요.

# JSON 형식의 COPY 지원
<a name="copy-usage_notes-copy-from-json"></a>

JSON 데이터 구조는 객체 또는 배열 집합으로 구성됩니다. JSON *객체*는 중괄호로 시작해서 끝나며 이름-값 페어 집합이 순서에 상관없이 포함되어 있습니다. 각 이름과 값은 각각 콜론으로 구분되며, 페어는 서로 쉼표로 구분됩니다. 이름은 큰 따옴표로 묶이는 문자열입니다. 인용 부호는 기울어진 따옴표나 "스마트" 따옴표가 아닌 단순한 따옴표(0x22)여야 합니다.

JSON *배열*은 대괄호로 시작해서 끝나며 쉼표로 구분된 값 집합이 순서에 따라 포함되어 있습니다. 값은 큰 따옴표로 묶이는 문자열, 숫자, 부울(true 또는 false), NULL, JSON 객체 또는 배열이 될 수 있습니다.

JSON 객체와 배열은 중첩이 가능하여 계층적인 데이터 구조를 이룹니다. 다음은 유효한 객체 2개가 포함된 JSON 데이터 구조의 예입니다.

```
{
    "id": 1006410,
    "title": "Amazon Redshift Database Developer Guide"
}
{
    "id": 100540,
    "name": "Amazon Simple Storage Service User Guide"
}
```

다음은 두 개의 JSON 배열과 동일한 데이터를 보여 줍니다.

```
[
    1006410,
    "Amazon Redshift Database Developer Guide"
]
[
    100540,
    "Amazon Simple Storage Service User Guide"
]
```

## JSON에 대한 COPY 옵션
<a name="copy-usage-json-options"></a>

JSON 형식 데이터와 함께 COPY를 사용할 경우 다음 옵션을 지정할 수 있습니다.
+ `'auto' ` - COPY가 JSON 파일에서 필드를 자동으로 로드합니다.
+ `'auto ignorecase'` - COPY가 필드 이름의 대/소문자를 무시하면서 JSON 파일에서 필드를 자동으로 로드합니다.
+ `s3://jsonpaths_file` - COPY가 JSONPaths 파일을 사용하여 JSON 원본 데이터를 구문 분석합니다. *JSONPaths 파일*은 이름 `"jsonpaths"`가 JSONPath 표현식 배열과 쌍을 이루는 단일 JSON 객체가 포함된 텍스트 파일입니다. 이때 이름이 `"jsonpaths"`가 아닌 다른 문자열이면 COPY는 JSONPaths 파일 대신 `'auto'` 인수를 사용합니다.

`'auto'`, `'auto ignorecase'` 또는 JSONPaths 파일을 사용하여 데이터를 로드하는 방식과 JSON 객체 또는 배열을 사용하여 데이터를 로드하는 방법을 나타낸 예는 [JSON에서 복사 예제](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json) 섹션을 참조하세요.

## JSONPath 옵션
<a name="copy-usage-json-options"></a>

Amazon Redshift COPY 구문에서 JSONPath 표현식은 대괄호 또는 점 표기법을 사용하여 JSON 계층적 데이터 구조의 단일 이름 요소에 대한 명시적 경로를 지정합니다. Amazon Redshift는 모호한 경로 또는 여러 이름 요소로 해석될 수 있는 와일드카드 문자 또는 필터 표현식과 같은 JSONPath 요소를 지원하지 않습니다. 결과적으로 Amazon Redshift는 복잡한 다단 데이터 구조의 구문을 분석할 수 없습니다.

다음은 대괄호 표기법을 사용하여 JSONPath 표현식을 작성한 JSONPaths 파일의 예입니다. 달러 기호(\$1)는 루트 레벨 구조를 나타냅니다.

```
{
    "jsonpaths": [
       "$['id']",
       "$['store']['book']['title']",
	"$['location'][0]" 
    ]
}
```

 위 예에서 `$['location'][0]`은 배열에서 첫 번째 요소를 참조합니다. JSON은 0부터 시작되는 배열 인덱싱을 사용합니다. 배열 인덱스는 0보다 크거나 같은 양의 정수가 되어야 합니다.

다음은 위의 JSONPaths 파일에 점 표기법을 사용한 예입니다.

```
{
    "jsonpaths": [
       "$.id",
       "$.store.book.title",
	"$.location[0]"
    ]
}
```

`jsonpaths` 배열에서 대괄호 표기법과 점 표기법을 혼용할 수는 없습니다. 다만 배열 요소를 참조할 때는 대괄호 표기법과 점 표기법 모두에서 대괄호를 사용할 수 있습니다.

점 표기법을 사용할 경우에는 JSONPath 표현식에 다음 문자가 포함되어서는 안 됩니다.
+ 작은 직선형 따옴표(') 
+ 마침표 또는 점(.) 
+ 배열 요소를 참조하기 위한 경우를 제외한 대괄호([ ]) 

JSONPath 표현식이 참조하는 이름-값 페어의 값이 객체 또는 배열이면 중괄호나 대괄호를 포함하여 전체 객체 또는 배열이 문자열로 로드됩니다. 예를 들어 JSON 데이터에 다음과 같은 객체가 포함되어 있다고 가정하겠습니다.

```
{
    "id": 0,
    "guid": "84512477-fa49-456b-b407-581d0d851c3c",
    "isActive": true,
    "tags": [
        "nisi",
        "culpa",
        "ad",
        "amet",
        "voluptate",
        "reprehenderit",
        "veniam"
    ],
    "friends": [
        {
            "id": 0,
            "name": "Martha Rivera"
        },
        {
            "id": 1,
            "name": "Renaldo"
        }
    ]
}
```

그러면 JSONPath 표현식 `$['tags']`가 다음 값을 반환합니다.

```
"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]" 
```

그러면 JSONPath 표현식 `$['friends'][1]`가 다음 값을 반환합니다.

```
"{"id": 1,"name": "Renaldo"}" 
```

`jsonpaths` 배열의 JSONPath 표현식은 각각 Amazon Redshift 대상 테이블의 열 1개에 해당합니다. 따라서 `jsonpaths` 배열 요소의 순서는 대상 테이블의 열 순서와, 혹은 열 목록을 사용하는 경우 열 목록의 열 순서와 일치해야 합니다.

`'auto'` 인수 또는 JSONPaths 파일을 사용하여 데이터를 로드하는 방법과 JSON 객체 또는 배열을 사용하여 데이터를 로드하는 방법을 보여주는 예는 [JSON에서 복사 예제](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json) 섹션을 참조하세요.

여러 JSON 파일을 복사하는 방법에 대한 자세한 내용은 [매니페스트를 사용하여 데이터 파일 지정](loading-data-files-using-manifest.md) 섹션을 참조하세요.

## JSON의 이스케이프 문자
<a name="copy-usage-json-escape-characters"></a>

COPY는 줄 바꿈 문자로 `\n`을, 그리고 탭 문자로 `\t`를 로드합니다. 백슬래시를 로드하려면 백슬래시(`\\`)로 이스케이프하세요.

예를 들어 `escape.json` 버킷에 저장된 `s3://amzn-s3-demo-bucket/json/`이라는 이름의 파일에 다음과 같은 JSON이 있다고 가정하겠습니다.

```
{
  "backslash": "This is a backslash: \\",
  "newline": "This sentence\n is on two lines.",
  "tab": "This sentence \t contains a tab."
}
```

다음 명령을 실행하여 ESCAPES 테이블을 생성하고 JSON을 로드합니다.

```
create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35));

copy escapes from 's3://amzn-s3-demo-bucket/json/escape.json' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as json 'auto';
```

ESCAPES 테이블에 대한 쿼리를 실행하여 결과를 확인합니다.

```
select * from escapes;

       backslash        |      newline      |               tab
------------------------+-------------------+----------------------------------
 This is a backslash: \ | This sentence     | This sentence    contains a tab.
                        :  is on two lines.
(1 row)
```

## 숫자 정밀도 상실
<a name="copy-usage-json-rounding"></a>

JSON 형식의 데이터 파일에서 숫자 데이터 형식으로 정의된 열로 숫자를 로드할 경우 정밀도가 상실될 수 있습니다. 일부 부동 소수점 값이 컴퓨터 시스템에 정확하게 표시되지 않습니다. 따라서 JSON 파일에서 복사하는 데이터가 예상한 대로 반올림되지 않을 수 있습니다. 정밀도 상실을 방지하려면 다음 대안 중 하나를 사용하는 것이 좋습니다.
+ 값을 큰 따옴표로 묶어서 숫자를 문자열로 표시합니다.
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec)를 사용하여 숫자를 자르지 않고 반올림합니다.
+ JSON 또는 Avro 파일 대신 CSV, 문자로 구분된 형식 또는 고정 너비 텍스트 파일을 사용합니다.

# 열 기반 데이터 형식에서 COPY 명령
<a name="copy-usage_notes-copy-from-columnar"></a>

COPY는 Amazon S3에서 다음과 같은 열 기반 형식의 데이터를 불러올 수 있습니다.
+ ORC
+ Parquet

열 데이터 형식에서 COPY를 사용하는 예는 [COPY 예](r_COPY_command_examples.md) 섹션을 참조하세요.

COPY는 열 기반 형식 데이터를 지원하지만 다음과 같은 고려 사항이 있습니다.
+ Amazon S3 버킷이 Amazon Redshift 데이터베이스와 동일한 AWS 리전에 있어야 합니다.
+ VPC 엔드포인트를 통해 Amazon S3 데이터에 액세스하려면 *Amazon Redshift 관리 가이드*의 [Enhanced VPC Routing과 함께 Amazon Redshift Spectrum 사용](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html)에 설명된 대로 IAM 정책과 IAM 역할을 사용하여 액세스를 설정합니다.
+ COPY는 압축 인코딩을 자동으로 적용하지 않습니다.
+ 다음과 같은 COPY 파라미터만 지원됩니다.
  + ORC 또는 Parquet 파일에서 복사하는 경우 [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars)
  + [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
  + [FROM](copy-parameters-data-source-s3.md#copy-parameters-from) ...
  + [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role)
  + [CREDENTIALS](copy-parameters-authorization.md#copy-credentials)
  + [STATUPDATE ](copy-parameters-data-load.md#copy-statupdate)
  + [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
  + [EXPLICIT\$1IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ COPY 명령을 실행하여 불러오는 중 오류가 발생하면 명령이 실패합니다. 열 기반 데이터 유형의 경우 ACCEPTANYDATE 및 MAXERROR가 지원되지 않습니다.
+ 오류 메시지는 SQL 클라이언트로 전송됩니다. 일부 오류는 STL\$1LOAD\$1ERRORS 및 STL\$1ERROR에 기록됩니다.
+ COPY 명령은 열 기반 데이터 파일의 열 순서와 동일하게 대상 테이블의 열에 값을 삽입합니다. 대상 테이블의 열 수와 데이터 파일의 열 수는 일치해야 합니다.
+ COPY 작업에 대해 지정한 파일에 다음 확장자 중 하나가 포함되어 있는 경우 파라미터를 추가하지 않고 데이터의 압축을 해제할 수 있습니다.
  + `.gz`
  + `.snappy`
  + `.bz2`
+ Parquet 및 ORC 파일 형식에서 COPY는 Redshift Spectrum과 버킷 액세스를 사용합니다. 이러한 형식에 COPY를 사용하려면 Amazon S3의 미리 서명된 URL 사용을 차단하는 IAM 정책이 없어야 합니다. Amazon Redshift에서 생성한 미리 서명된 URL은 1시간 동안 유효하므로 Amazon Redshift가 충분한 시간을 갖고 Amazon S3 버킷에서 모든 파일을 로드할 수 있습니다. 열 기반 데이터 형식에서 COPY로 스캔한 각 파일에 대해 미리 서명된 고유한 URL이 생성됩니다. `s3:signatureAge` 작업이 포함된 버킷 정책의 경우 값을 최소 3,600,000밀리초로 설정해야 합니다. 자세한 내용은 [Enhanced VPC Routing과 함께 Amazon Redshift Spectrum 사용](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html) 섹션을 참조하세요.
+ REGION 파라미터는 열 데이터 형식의 COPY에서는 지원되지 않습니다. Amazon S3 버킷과 데이터베이스가 동일한 AWS 리전에 있더라도 PARQUET 기반 COPY에는 REGION 인수가 지원되지 않음 등의 오류가 발생할 수 있습니다.
+ 열 형식의 COPY는 이제 동시성 규모 조정을 지원합니다. 동시성 규모 조정을 활성화하려면 [동시성 규모 조정 대기열 구성](https://docs.aws.amazon.com/redshift/latest/dg/concurrency-scaling.html#concurrency-scaling-queues)을 참조하세요.

# DATEFORMAT 및 TIMEFORMAT 문자열
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings"></a>

COPY 명령은 DATEFORMAT 및 TIMEFORMAT 옵션을 사용하여 소스 데이터의 날짜 및 시간 값을 구문 분석합니다. DATEFORMAT 및 TIMEFORMAT은 소스 데이터의 날짜 및 시간 값 형식과 일치해야 하는 형식이 지정된 문자열입니다. 예를 들어 날짜 값이 `Jan-01-1999`인 소스 데이터를 로드하는 COPY 명령에는 다음 DATEFORMAT 문자열이 포함되어야 합니다.

```
COPY ...
            DATEFORMAT AS 'MON-DD-YYYY'
```

COPY 데이터 변환 관리에 대한 자세한 내용은 [데이터 변환 파라미터](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-conversion.html)를 참조하세요.

DATEFORMAT 및 TIMEFORMAT 문자열은 날짜/시간 구분 기호(예: '`-`', '`/`' 또는 '`:`')와 다음 테이블의 날짜 부분 및 시간 부분 형식을 포함할 수 있습니다.

**참고**  
날짜 또는 시간 값의 형식을 다음 날짜 부분 및 시간 부분과 일치시킬 수 없거나 서로 다른 형식을 사용하는 날짜 및 시간 값이 있는 경우 DATEFORMAT 또는 TIMEFORMAT 파라미터와 함께 `'auto'` 인수를 사용하세요. `'auto'` 인수는 DATEFORMAT 또는 TIMEFORMAT 문자열 사용 시 지원되지 않는 몇 가지 형식을 인식합니다. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md) 섹션을 참조하세요.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

기본 날짜 형식은 YYYY-MM-DD입니다. 시간대(TIMESTAMP)를 제외한 기본 타임스탬프 형식은 YYYY-MM-DD HH:MI:SS입니다. 시간대가 포함된 기본 타임스탬프(TIMESTAMPTZ) 형식은 YYYY-MM-DD HH:MI:SSOF입니다. 여기서 OF는 UTC의 오프셋입니다(예: -8:00). timeformat\$1string에 시간대 지정자(TZ, tz 또는 OF)를 포함할 수 없습니다. 초(SS) 필드는 마이크로초 수준의 세부 정보까지 소수 초를 지원합니다. 기본 형식과 다른 형식으로 TIMESTAMPTZ 데이터를 로드하려면 'auto'를 지정합니다.

다음은 소스 데이터에서 볼 수 있는 몇 가지 샘플 날짜 또는 시간과 그에 해당하는 DATEFORMAT 또는 TIMEFORMAT 문자열입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

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

TIMEFORMAT 사용 예는 [타임스탬프 또는 데이트스탬프 로드](r_COPY_command_examples.md#r_COPY_command_examples-load-a-time-datestamp)을 참조하세요.

# DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용
<a name="automatic-recognition"></a>

DATEFORMAT 또는 TIMEFORMAT 파라미터의 인수로 `'auto'`를 지정하면 Amazon Redshift가 원본 데이터의 날짜 형식 또는 시간 형식을 자동으로 인식하여 변환합니다. 다음은 그 한 예입니다.

```
copy favoritemovies from 'dynamodb://ProductCatalog' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
dateformat 'auto';
```

DATEFORMAT 및 TIMEFORMAT 파라미터에서 `'auto'` 인수를 사용하면 COPY가 [DATEFORMAT 및 TIMEFORMAT 문자열예제](r_DATEFORMAT_and_TIMEFORMAT_strings.md) 섹션의 표에 나열된 날짜 및 시간 형식을 인식하여 변환합니다. 또한 `'auto'` 인수는 DATEFORMAT 및 TIMEFORMAT 문자열 사용 시 아래와 같이 지원되지 않는 몇 가지 형식을 인식합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/automatic-recognition.html)

자동 인식은 epochsec 및 epochmillisec을 지원하지 않습니다.

날짜 또는 타임스탬프 값의 자동 변환 여부를 테스트하려면 CAST 함수를 사용하여 문자열을 날짜 또는 타임스탬프 값으로 변환해볼 수 있습니다. 예를 들어 다음은 타임스탬프 값 `'J2345678 04:05:06.789'`를 테스트하는 명령입니다.

```
create table formattest (test char(21));
insert into formattest values('J2345678 04:05:06.789');
select test, cast(test as timestamp) as timestamp, cast(test as date) as date from formattest;

        test          |      timestamp      |	date
----------------------+---------------------+------------
J2345678 04:05:06.789   1710-02-23 04:05:06	1710-02-23
```

DATE 열의 원본 데이터에 시간 정보가 포함되면 시간 구성요소는 잘립니다. TIMESTAMP 열의 원본 데이터에서 시간 정보가 빠지면 시간 구성요소로 00:00:00이 사용됩니다.

# COPY 예
<a name="r_COPY_command_examples"></a>

**참고**  
여기에서 설명하는 예는 가독성을 위해 줄 바꿈이 포함되었습니다. 실제 *credentials-args* 문자열에서는 줄 바꿈이나 공백을 입력하지 마세요.

**Topics**
+ [DynamoDB 테이블에서 FAVORITEMOVIES 로드](#r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table)
+ [Amazon S3 버킷에서 LISTING 로드](#r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket)
+ [Amazon EMR 클러스터에서 LISTING 로드](#copy-command-examples-emr)
+ [Example: COPY from Amazon S3 using a manifest](#copy-command-examples-manifest)
+ [파이프로 구분된 파일(기본 구분자)에서 LISTING 로드](#r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter)
+ [Parquet 형식의 열 기반 데이터를 사용한 LISTING 로드](#r_COPY_command_examples-load-listing-from-parquet)
+ [ORC 형식의 열 기반 데이터를 사용한 LISTING 로드](#r_COPY_command_examples-load-listing-from-orc)
+ [옵션을 사용한 EVENT 로드](#r_COPY_command_examples-load-event-with-options)
+ [고정 폭 데이터 파일에서 VENUE 로드](#r_COPY_command_examples-load-venue-from-a-fixed-width-data-file)
+ [CSV 파일에서 CATEGORY 로드](#load-from-csv)
+ [IDENTITY 열의 명시적인 값을 사용한 VENUE 로드](#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column)
+ [파이프로 구분된 GZIP파일에서 TIME 로드](#r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file)
+ [타임스탬프 또는 데이트스탬프 로드](#r_COPY_command_examples-load-a-time-datestamp)
+ [파일에서 기본값을 사용한 데이터 로드](#r_COPY_command_examples-load-data-from-a-file-with-default-values)
+ [ESCAPE 옵션을 사용한 데이터 COPY 작업](#r_COPY_command_examples-copy-data-with-the-escape-option)
+ [JSON에서 복사 예제](#r_COPY_command_examples-copy-from-json)
+ [Avro에서 복사 예제](#r_COPY_command_examples-copy-from-avro)
+ [ESCAPE 옵션과 함께 COPY에 사용할 파일 준비](#r_COPY_preparing_data)
+ [Amazon Redshift에 shapefile 로드](#copy-example-spatial-copy-shapefile)
+ [NOLOAD 옵션을 사용한 CPPY 명령](#r_COPY_command_examples-load-noload-option)
+ [멀티바이트 구분 기호와 ENCODING 옵션을 포함한 COPY 명령](#r_COPY_command_examples-load-encoding-multibyte-delimiter-option)

## DynamoDB 테이블에서 FAVORITEMOVIES 로드
<a name="r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table"></a>

AWS SDK에는 *Movies*라는 DynamoDB 테이블을 생성하는 간단한 예가 포함되어 있습니다. 이러한 예제는 [DynamoDB 시작하기](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.html)를 참조하세요. 다음은 DynamoDB 테이블의 데이터를 Amazon Redshift MOVIES 테이블에 로드하는 예입니다. Amazon Redshift 테이블은 사전에 데이터베이스에 존재해야 하며,

```
copy favoritemovies from 'dynamodb://Movies'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
readratio 50;
```

## Amazon S3 버킷에서 LISTING 로드
<a name="r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket"></a>

다음 예는 Amazon S3 버킷에서 LISTING을 로드합니다. COPY 명령은 `/data/listing/` 폴더에 위치한 모든 파일을 로드합니다.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listing/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Amazon EMR 클러스터에서 LISTING 로드
<a name="copy-command-examples-emr"></a>

다음은 Amazon EMR 클러스터의 lzop 압축 파일에서 탭으로 구분된 데이터를 SALES 테이블과 함께 로드하는 예입니다. COPY는 `myoutput/` 폴더에서 `part-`로 시작하는 모든 파일을 로드합니다.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '\t' lzop;
```

다음은 Amazon EMR 클러스터에서 JSON 형식 데이터를 SALES 테이블과 함께 로드하는 예입니다. COPY는 `myoutput/json/` 폴더에서 모든 파일을 로드합니다.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/json/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
JSON 's3://amzn-s3-demo-bucket/jsonpaths.txt';
```

## 매니페스트를 사용하여 데이터 파일 지정
<a name="copy-command-examples-manifest"></a>

매니페스트를 사용하여 COPY 명령이 Amazon S3에서 필요한 파일을 모두, 즉 필요한 파일만 로드할 수 있습니다. 그 밖에 동일한 접두사를 공유하지 않는 다른 버킷이나 파일에서 다수의 파일을 로드해야 할 때도 매니페스트를 사용할 수 있습니다.

예를 들어 `custdata1.txt`, `custdata2.txt`, `custdata3.txt` 등 파일 3개를 로드해야 하는 경우 다음 명령을 사용하여 접두사를 지정함으로써 `amzn-s3-demo-bucket`에서 `custdata`로 시작하는 파일을 모두 로드할 수 있습니다.

```
copy category
from 's3://amzn-s3-demo-bucket/custdata' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

실수로 파일이 2개만 존재하는 경우에는 COPY가 해당 파일 2개만 로드하고 명령을 성공적으로 마치지만 결과적으로는 불완전 데이터 로드가 됩니다. 불필요하지만 동일한 접두사를 사용하는 파일(예: `custdata.backup` 파일)이 버킷에 있다면 COPY가 해당 파일까지 로드하므로 결국 원하지 않는 데이터가 로드됩니다.

필요한 파일은 모두 로드하고 원하지 않는 파일은 로드되지 않도록 하려면 매니페스트 파일을 사용합니다. 매니페스트란 COPY 명령에서 처리할 파일이 나열된 JSON 형식의 파일을 말합니다. 예를 들어 다음 매니페스트는 위의 예에서 파일 3개를 로드합니다.

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.1",
         "mandatory":true
      },
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.2",
         "mandatory":true
      },
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.3",
         "mandatory":true
      }
   ]
}
```

옵션인 `mandatory` 플래그는 파일이 없을 때 COPY의 종료 여부를 나타냅니다. 기본값은 `false`입니다. 필수 설정에 상관없이 파일이 검색되지 않으면 COPY가 종료됩니다. 이 예에서 파일 중 하나라도 검색되지 않으면 COPY가 오류를 반환합니다. 키 접두사만 지정하여 선택될 수도 있는 불필요한 파일(`custdata.backup` 등)은 매니페스트에 없기 때문에 무시됩니다.

ORC 또는 Parquet 형식의 데이터 파일에서 불러올 경우 다음 예에 나와 있는 것처럼 `meta` 필드가 필요합니다.

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      },
      {  
         "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      }
   ]
}
```

다음 예는 `cust.manifest`라는 매니페스트를 사용합니다.

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc
manifest;
```

매니페스트를 이용하면 다른 버킷, 다른 리전이나 접두사가 다른 파일에서 파일을 불러올 수 있습니다. 다음은 이름이 데이트스탬프로 시작하는 파일의 데이터를 로드하는 JSON 예입니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/2013-10-04-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-05-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-06-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-07-custdata.txt","mandatory":true}
  ]
}
```

매니페스트는 버킷이 클러스터와 동일한 AWS 리전에 속하는 한 다른 버킷에 있는 파일을 나열할 수 있습니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata1.txt","mandatory":false},
    {"url":"s3://amzn-s3-demo-bucket2/custdata1.txt","mandatory":false},
    {"url":"s3://amzn-s3-demo-bucket2/custdata2.txt","mandatory":false}
  ]
}
```

## 파이프로 구분된 파일(기본 구분자)에서 LISTING 로드
<a name="r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter"></a>

다음은 별도의 옵션 지정 없이 입력 파일에 기본 구분자인 파이프 문자('\$1')가 포함된, 매우 단순한 예입니다.

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Parquet 형식의 열 기반 데이터를 사용한 LISTING 로드
<a name="r_COPY_command_examples-load-listing-from-parquet"></a>

다음은 Amazon S3에서 parquet이라는 데이터를 로드하는 예입니다.

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/parquet/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as parquet;
```

## ORC 형식의 열 기반 데이터를 사용한 LISTING 로드
<a name="r_COPY_command_examples-load-listing-from-orc"></a>

다음은 Amazon S3에서 `orc`라는 데이터를 로드하는 예입니다.

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/orc/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc;
```

## 옵션을 사용한 EVENT 로드
<a name="r_COPY_command_examples-load-event-with-options"></a>

다음은 파이프로 구분된 데이터를 EVENT 테이블에 로드하면서 아래 규칙을 적용하는 예입니다.
+ 인용 부호 쌍을 사용하여 문자열을 묶는 경우 인용 부호가 삭제됩니다.
+ 빈 문자열과 공백이 포함된 문자열 모두 NULL 값으로 로드됩니다.
+ 오류가 6회 이상 반환되면 로드가 실패합니다.
+ 타임스탬프 값은 지정된 형식을 따라야 합니다. 예를 들어 유효한 타임스탬프는 `2008-09-26 05:43:12`입니다.

```
copy event
from 's3://amzn-s3-demo-bucket/data/allevents_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
removequotes
emptyasnull
blanksasnull
maxerror 5
delimiter '|'
timeformat 'YYYY-MM-DD HH:MI:SS';
```

## 고정 폭 데이터 파일에서 VENUE 로드
<a name="r_COPY_command_examples-load-venue-from-a-fixed-width-data-file"></a>

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue_fw.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';
```

위의 예는 데이터 파일이 샘플 데이터와 동일한 형식이라는 가정을 전제로 합니다. 아래 샘플에서는 모든 열이 명세에서 기록한 것과 동일한 폭을 갖도록 공백이 자리 표시자의 역할을 합니다.

```
1  Toyota Park              Bridgeview  IL0
2  Columbus Crew Stadium    Columbus    OH0
3  RFK Stadium              Washington  DC0
4  CommunityAmerica BallparkKansas City KS0
5  Gillette Stadium         Foxborough  MA68756
```

## CSV 파일에서 CATEGORY 로드
<a name="load-from-csv"></a>

다음과 같이 표에 기재된 값을 CATEGORY에 로드한다고 가정하겠습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_COPY_command_examples.html)

다음 예에서는 필드 값을 쉼표로 구분하여 텍스트 파일의 내용을 보여 줍니다.

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,All "non-musical" theatre  
14,Shows,Opera,All opera, light, and "rock" opera
15,Concerts,Classical,All symphony, concerto, and choir concerts
```

쉼표로 구분된 입력을 지정하는 DELIMITER 파라미터를 사용하여 파일을 로드하면 일부 입력 필드에 쉼표가 포함되어 있기 때문에 COPY 명령이 실패합니다. 이러한 문제는 CSV 파라미터를 사용하고 쉼표가 포함된 필드를 인용 부호로 묶으면 피할 수 있습니다. 인용 부호가 다른 인용 부호로 묶인 문자열 내에 들어가는 경우에는 인용 부호를 이중으로 사용하여 이스케이프 처리해야 합니다. 기본 인용 부호가 큰따옴표이므로 큰따옴표를 추가하여 큰따옴표를 각각 이스케이프 처리해야 합니다. 새 입력 파일의 모양은 다음과 같습니다.

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,"All ""non-musical"" theatre"
14,Shows,Opera,"All opera, light, and ""rock"" opera"
15,Concerts,Classical,"All symphony, concerto, and choir concerts"
```

파일 이름이 `category_csv.txt`인 경우 다음 COPY 명령을 사용하여 파일을 로드할 수 있습니다.

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv;
```

그 밖에 입력 파일에서 큰따옴표의 이스케이프 처리를 피하려면 QUOTE AS 파라미터를 사용해 다른 인용 부호를 지정하는 방법도 있습니다. 예를 들어 다음 버전의 `category_csv.txt`는 '`%`'를 인용 부호로 사용합니다.

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,%All "non-musical" theatre%
14,Shows,Opera,%All opera, light, and "rock" opera%
15,Concerts,Classical,%All symphony, concerto, and choir concerts%
```

다음은 QUOTE AS를 사용하여 `category_csv.txt`를 로드하는 COPY 명령입니다.

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv quote as '%';
```

## IDENTITY 열의 명시적인 값을 사용한 VENUE 로드
<a name="r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column"></a>

다음 예는 VENUE 테이블을 생성하면서 1개 이상의 열(`venueid` 열 등)을 IDENTITY 열로 지정했다는 가정을 전제로 합니다. 이 명령은 IDENTITY 열의 자동 생성 값에 대한 기본적인 IDENTITY 동작을 재정의하고 venue.txt 파일에서 명시적인 값을 로드합니다. Amazon Redshift는 EXLICIT\$1IDS 옵션을 사용할 때 테이블에 중복된 IDENTITY 값이 로드되었는지 확인하지 않습니다.

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
explicit_ids;
```

## 파이프로 구분된 GZIP파일에서 TIME 로드
<a name="r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file"></a>

다음은 파이프로 구분된 GZIP 파일에서 TIME 테이블을 로드하는 예입니다.

```
copy time
from 's3://amzn-s3-demo-bucket/data/timerows.gz' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
gzip
delimiter '|';
```

## 타임스탬프 또는 데이트스탬프 로드
<a name="r_COPY_command_examples-load-a-time-datestamp"></a>

다음은 형식이 지정된 타임스탬프로 데이터를 로드하는 예입니다.

**참고**  
`HH:MI:SS` 형식의 TIMEFORMAT 역시 `SS`를 넘어 마이크로초의 정밀도까지 소수 초를 지원합니다. 이번 예에서 사용하는 `time.txt` 파일에는 `2009-01-12 14:15:57.119568` 행 하나가 포함되어 있습니다.

```
copy timestamp1 
from 's3://amzn-s3-demo-bucket/data/time.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
timeformat 'YYYY-MM-DD HH:MI:SS';
```

이 파일의 구조는 다음과 같습니다.

```
select * from timestamp1;
c1
----------------------------
2009-01-12 14:15:57.119568
(1 row)
```

## 파일에서 기본값을 사용한 데이터 로드
<a name="r_COPY_command_examples-load-data-from-a-file-with-default-values"></a>

다음은 TICKIT 데이터베이스에서 변형된 VENUE 테이블을 사용하는 예입니다. 이때 VENUE\$1NEW 테이블을 아래와 같은 문으로 정의한다고 가정합니다.

```
create table venue_new(
venueid smallint not null,
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
```

아래 예와 같이 venue\$1noseats.txt 데이터 파일에 VENUESEATS 열의 값이 포함되어 있지 않다고 가정합니다.

```
1|Toyota Park|Bridgeview|IL|
2|Columbus Crew Stadium|Columbus|OH|
3|RFK Stadium|Washington|DC|
4|CommunityAmerica Ballpark|Kansas City|KS|
5|Gillette Stadium|Foxborough|MA|
6|New York Giants Stadium|East Rutherford|NJ|
7|BMO Field|Toronto|ON|
8|The Home Depot Center|Carson|CA|
9|Dick's Sporting Goods Park|Commerce City|CO|
10|Pizza Hut Park|Frisco|TX|
```

다음은 데이터 파일에서 테이블을 성공적으로 로드한 후 누락된 열에 DEFAULT 값('1000')을 적용하는 COPY 문입니다.

```
copy venue_new(venueid, venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_noseats.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

그 결과 로드되는 테이블은 다음과 같습니다.

```
select * from venue_new order by venueid;
venueid |         venuename          |    venuecity    | venuestate | venueseats
---------+----------------------------+-----------------+------------+------------
1 | Toyota Park                | Bridgeview      | IL         |       1000
2 | Columbus Crew Stadium      | Columbus        | OH         |       1000
3 | RFK Stadium                | Washington      | DC         |       1000
4 | CommunityAmerica Ballpark  | Kansas City     | KS         |       1000
5 | Gillette Stadium           | Foxborough      | MA         |       1000
6 | New York Giants Stadium    | East Rutherford | NJ         |       1000
7 | BMO Field                  | Toronto         | ON         |       1000
8 | The Home Depot Center      | Carson          | CA         |       1000
9 | Dick's Sporting Goods Park | Commerce City   | CO         |       1000
10 | Pizza Hut Park             | Frisco          | TX         |       1000
(10 rows)
```

다음 예에서는 파일에 VENUESEATS 데이터가 포함되지 않았을 뿐만 아니라 VENUENAME 데이터도 포함되지 않았다고 가정합니다.

```
1||Bridgeview|IL|
2||Columbus|OH|
3||Washington|DC|
4||Kansas City|KS|
5||Foxborough|MA|
6||East Rutherford|NJ|
7||Toronto|ON|
8||Carson|CA|
9||Commerce City|CO|
10||Frisco|TX|
```

 동일한 테이블 정의를 사용하는 경우 VENUENAME에 대한 DEFAULT 값이 지정되지 않았고 VENUENAME이 NOT NULL 열이므로 다음 COPY 문이 실패합니다.

```
copy venue(venueid, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

이제 IDENTITY 열을 사용하는 다른 형태의 VENUE 테이블이 있다고 가정합니다.

```
create table venue_identity(
venueid int identity(1,1),
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
```

앞의 예와 마찬가지로 원본 파일에 VENUESEATS 열에 해당하는 값이 없다고 가정하면 다음 COPY 문에서 사전 정의한 IDENTITY 데이터 값을 자동 생성하지 않고 포함하는 테이블을 성공적으로 로드합니다.

```
copy venue(venueid, venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|' explicit_ids;
```

다음 문은 IDENTITY 열 없이(VENUEID가 열 목록에서 누락됨) EXPLICIT\$1IDS 파라미터를 추가했기 때문에 중단됩니다.

```
copy venue(venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|' explicit_ids;
```

다음 문은 EXPLICIT\$1IDS 파라미터를 추가하지 않았기 때문에 중단됩니다.

```
copy venue(venueid, venuename, venuecity, venuestate)
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

## ESCAPE 옵션을 사용한 데이터 COPY 작업
<a name="r_COPY_command_examples-copy-data-with-the-escape-option"></a>

다음은 구분자 문자(여기에서는 파이프 문자)와 일치하는 문자의 로드 방법을 나타낸 예입니다. 먼저 입력 파일에서 로드할 파이프 문자(\$1)가 모두 백슬래시 문자(\$1)를 사용해 이스케이프 처리되어 있는지 확인합니다. 그런 다음 ESCAPE 파라미터를 사용해 파일을 로드합니다.

```
$ more redshiftinfo.txt
1|public\|event\|dwuser
2|public\|sales\|dwuser

create table redshiftinfo(infoid int,tableinfo varchar(50));

copy redshiftinfo from 's3://amzn-s3-demo-bucket/data/redshiftinfo.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
delimiter '|' escape;

select * from redshiftinfo order by 1;
infoid |       tableinfo
-------+--------------------
1      | public|event|dwuser
2      | public|sales|dwuser
(2 rows)
```

ESCAPE 파라미터를 사용하지 않으면 이 COPY 문은 `Extra column(s) found` 오류와 함께 중단됩니다.

**중요**  
COPY를 ESCAPE 파라미터와 함께 사용하여 데이터를 로드하는 경우 역수 출력 파일을 생성하도록 UNLOAD 명령과 함께 ESCAPE 파라미터도 지정해야 합니다. 마찬가지로 ESCAPE 파라미터를 사용하여 UNLOAD하는 경우 동일한 데이터를 COPY할 때 ESCAPE를 사용해야 합니다.

## JSON에서 복사 예제
<a name="r_COPY_command_examples-copy-from-json"></a>

다음 예에서는 다음 데이터와 함께 CATEGORY 테이블을 로드합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ ['auto' 옵션을 사용하여 JSON 데이터에서 로드](#copy-from-json-examples-using-auto)
+ ['auto ignorecase' 옵션을 사용하여 JSON 데이터에서 로드](#copy-from-json-examples-using-auto-ignorecase)
+ [JSONPaths 파일을 사용하여 JSON 데이터에서 로드](#copy-from-json-examples-using-jsonpaths)
+ [JSONPaths 파일을 사용하여 JSON 배열에서 로드](#copy-from-json-examples-using-jsonpaths-arrays)

### 'auto' 옵션을 사용하여 JSON 데이터에서 로드
<a name="copy-from-json-examples-using-auto"></a>

JSON 데이터에서 `'auto'` 옵션을 사용해 로드하려면 JSON 데이터가 객체 집합으로 구성되어야 합니다. 키 이름이 열 이름과 일치해야 하지만 순서는 중요하지 않습니다. 다음은 `category_object_auto.json`이라는 이름의 파일 내용을 나타낸 것입니다.

```
{
    "catdesc": "Major League Baseball",
    "catid": 1,
    "catgroup": "Sports",
    "catname": "MLB"
}
{
    "catgroup": "Sports",
    "catid": 2,
    "catname": "NHL",
    "catdesc": "National Hockey League"
}
{
    "catid": 3,
    "catname": "NFL",
    "catgroup": "Sports",
    "catdesc": "National Football League"
}
{
    "bogus": "Bogus Sports LLC",
    "catid": 4,
    "catgroup": "Sports",
    "catname": "NBA",
    "catdesc": "National Basketball Association"
}
{
    "catid": 5,
    "catgroup": "Shows",
    "catname": "Musicals",
    "catdesc": "All symphony, concerto, and choir concerts"
}
```

위의 예에 있는 JSON 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto';
```

### 'auto ignorecase' 옵션을 사용하여 JSON 데이터에서 로드
<a name="copy-from-json-examples-using-auto-ignorecase"></a>

JSON 데이터에서 `'auto ignorecase'` 옵션을 사용해 로드하려면 JSON 데이터가 객체 집합으로 구성되어야 합니다. 키 이름의 대/소문자는 열 이름과 일치하지 않아도 되며 순서는 중요하지 않습니다. 다음은 `category_object_auto-ignorecase.json`이라는 이름의 파일 내용을 나타낸 것입니다.

```
{
    "CatDesc": "Major League Baseball",
    "CatID": 1,
    "CatGroup": "Sports",
    "CatName": "MLB"
}
{
    "CatGroup": "Sports",
    "CatID": 2,
    "CatName": "NHL",
    "CatDesc": "National Hockey League"
}
{
    "CatID": 3,
    "CatName": "NFL",
    "CatGroup": "Sports",
    "CatDesc": "National Football League"
}
{
    "bogus": "Bogus Sports LLC",
    "CatID": 4,
    "CatGroup": "Sports",
    "CatName": "NBA",
    "CatDesc": "National Basketball Association"
}
{
    "CatID": 5,
    "CatGroup": "Shows",
    "CatName": "Musicals",
    "CatDesc": "All symphony, concerto, and choir concerts"
}
```

위의 예에 있는 JSON 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto ignorecase.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto ignorecase';
```

### JSONPaths 파일을 사용하여 JSON 데이터에서 로드
<a name="copy-from-json-examples-using-jsonpaths"></a>

JSON 데이터 객체가 열 이름과 정확히 일치하지 않으면 JSONPaths 파일을 사용하여 JSON 요소를 열로 매핑할 수 있습니다. JSON 원본 데이터에서 순서는 중요하지 않습니다. 단, JSONPaths 파일 표현식의 순서는 열 순서와 일치해야 합니다. 다음과 같이 `category_object_paths.json`이라는 이름의 데이터 파일이 있는 경우

```
{
    "one": 1,
    "two": "Sports",
    "three": "MLB",
    "four": "Major League Baseball"
}
{
    "three": "NHL",
    "four": "National Hockey League",
    "one": 2,
    "two": "Sports"
}
{
    "two": "Sports",
    "three": "NFL",
    "one": 3,
    "four": "National Football League"
}
{
    "one": 4,
    "two": "Sports",
    "three": "NBA",
    "four": "National Basketball Association"
}
{
    "one": 6,
    "two": "Shows",
    "three": "Musicals",
    "four": "All symphony, concerto, and choir concerts"
}
```

이름이 `category_jsonpath.json`인 다음 JSONPaths 파일이 원본 데이터를 테이블 열로 매핑합니다.

```
{
    "jsonpaths": [
        "$['one']",
        "$['two']",
        "$['three']",
        "$['four']"
    ]
}
```

위의 예에 있는 JSON 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_jsonpath.json';
```

### JSONPaths 파일을 사용하여 JSON 배열에서 로드
<a name="copy-from-json-examples-using-jsonpaths-arrays"></a>

배열 집합으로 구성된 JSON 데이터에서 로드하려면 JSONPaths 파일을 사용하여 배열 요소를 열로 매핑해야 합니다. 다음과 같이 `category_array_data.json`이라는 이름의 데이터 파일이 있는 경우

```
[1,"Sports","MLB","Major League Baseball"]
[2,"Sports","NHL","National Hockey League"]
[3,"Sports","NFL","National Football League"]
[4,"Sports","NBA","National Basketball Association"]
[5,"Concerts","Classical","All symphony, concerto, and choir concerts"]
```

이름이 `category_array_jsonpath.json`인 다음 JSONPaths 파일이 원본 데이터를 테이블 열로 매핑합니다.

```
{
    "jsonpaths": [
        "$[0]",
        "$[1]",
        "$[2]",
        "$[3]"
    ]
}
```

위의 예에 있는 JSON 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_array_data.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_array_jsonpath.json';
```

## Avro에서 복사 예제
<a name="r_COPY_command_examples-copy-from-avro"></a>

다음 예에서는 다음 데이터와 함께 CATEGORY 테이블을 로드합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ ['auto' 옵션을 사용하여 Avro 데이터에서 로드](#copy-from-avro-examples-using-auto)
+ ['auto ignorecase' 옵션을 사용하여 Avro 데이터에서 로드](#copy-from-avro-examples-using-auto-ignorecase)
+ [JSONPaths 파일을 사용하여 Avro 데이터에서 로드](#copy-from-avro-examples-using-avropaths)

### 'auto' 옵션을 사용하여 Avro 데이터에서 로드
<a name="copy-from-avro-examples-using-auto"></a>

Avro 데이터에서 `'auto'` 인수를 사용하여 로드하려면 Avro 스키마의 필드 이름이 열 이름과 일치해야 합니다. `'auto'` 인수를 사용할 때 순서는 중요하지 않습니다. 다음은 이름이 `category_auto.avro`인 파일의 스키마를 나타낸 것입니다.

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "catid", "type": "int"},
        {"name": "catdesc", "type": "string"},
        {"name": "catname", "type": "string"},
        {"name": "catgroup", "type": "string"},
}
```

Avro 파일의 데이터는 이진 형식이기 때문에 사람이 읽을 수 없습니다. 다음은 `category_auto.avro` 파일의 데이터를 JSON으로 표현한 것입니다.

```
{
   "catid": 1,
   "catdesc": "Major League Baseball",
   "catname": "MLB",
   "catgroup": "Sports"
}
{
   "catid": 2,
   "catdesc": "National Hockey League",
   "catname": "NHL",
   "catgroup": "Sports"
}
{
   "catid": 3,
   "catdesc": "National Basketball Association",
   "catname": "NBA",
   "catgroup": "Sports"
}
{
   "catid": 4,
   "catdesc": "All symphony, concerto, and choir concerts",
   "catname": "Classical",
   "catgroup": "Concerts"
}
```

위의 예에 있는 Avro 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto';
```

### 'auto ignorecase' 옵션을 사용하여 Avro 데이터에서 로드
<a name="copy-from-avro-examples-using-auto-ignorecase"></a>

Avro 데이터에서 `'auto ignorecase'` 인수를 사용하여 로드하려는 경우 Avro 스키마에서 필드 이름의 대/소문자는 열 이름의 대/소문자와 일치하지 않아도 됩니다. `'auto ignorecase'` 인수를 사용할 때 순서는 중요하지 않습니다. 다음은 이름이 `category_auto-ignorecase.avro`인 파일의 스키마를 나타낸 것입니다.

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "CatID", "type": "int"},
        {"name": "CatDesc", "type": "string"},
        {"name": "CatName", "type": "string"},
        {"name": "CatGroup", "type": "string"},
}
```

Avro 파일의 데이터는 이진 형식이기 때문에 사람이 읽을 수 없습니다. 다음은 `category_auto-ignorecase.avro` 파일의 데이터를 JSON으로 표현한 것입니다.

```
{
   "CatID": 1,
   "CatDesc": "Major League Baseball",
   "CatName": "MLB",
   "CatGroup": "Sports"
}
{
   "CatID": 2,
   "CatDesc": "National Hockey League",
   "CatName": "NHL",
   "CatGroup": "Sports"
}
{
   "CatID": 3,
   "CatDesc": "National Basketball Association",
   "CatName": "NBA",
   "CatGroup": "Sports"
}
{
   "CatID": 4,
   "CatDesc": "All symphony, concerto, and choir concerts",
   "CatName": "Classical",
   "CatGroup": "Concerts"
}
```

위의 예에 있는 Avro 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto-ignorecase.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto ignorecase';
```

### JSONPaths 파일을 사용하여 Avro 데이터에서 로드
<a name="copy-from-avro-examples-using-avropaths"></a>

Avro 스키마의 필드 이름이 열 이름과 정확히 일치하지 않으면 JSONPaths 파일을 사용하여 스키마 요소를 열로 매핑할 수 있습니다. JSONPaths 파일 표현식의 순서는 열 순서와 일치해야 합니다.

앞의 예와 동일한 데이터를 포함하지만 스키마는 다음과 같은 이름이 `category_paths.avro`인 데이터 파일이 있는 경우

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "desc", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "group", "type": "string"},
        {"name": "region", "type": "string"} 
     ]
}
```

이름이 `category_path.avropath`인 다음 JSONPaths 파일이 원본 데이터를 테이블 열로 매핑합니다.

```
{
    "jsonpaths": [
        "$['id']",
        "$['group']",
        "$['name']",
        "$['desc']"
    ]
}
```

위의 예에 있는 Avro 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
format avro 's3://amzn-s3-demo-bucket/category_path.avropath ';
```

## ESCAPE 옵션과 함께 COPY에 사용할 파일 준비
<a name="r_COPY_preparing_data"></a>

다음 예에서는 ESCAPE 파라미터와 함께 COPY 명령을 사용하여 데이터를 Amazon Redshift 테이블에 가져오기 전에 줄 바꿈 문자를 "이스케이프" 처리하도록 데이터를 준비하는 방법을 설명합니다. 줄 바꿈 문자를 구분할 데이터를 준비하지 않으면 줄 바꿈 문자가 대개 레코드 구분자로 사용되므로 COPY 명령을 실행할 때 Amazon Redshift에서 오류를 로드합니다.

예를 들어 외부 테이블에 Amazon Redshift 테이블로 복사할 파일 또는 열이 있는 경우 파일 또는 열에 XML 형식의 내용이나 이와 비슷한 데이터가 포함되어 있으면 내용의 일부인 줄 바꿈 문자(\$1n)가 모두 백슬래시 문자(\$1)로 이스케이프 처리되어 있는지 확인해야 합니다.

줄 바꿈 문자가 포함된 파일 또는 테이블은 비교적 식별하기 용이한 패턴을 제공합니다. 줄 바꿈 문자가 항상 `>` 문자 뒤에 나오고, 그 사이에 잠재적으로 공백(`' '` 또는 탭)이 포함될 가능성이 매우 높기 때문입니다. 다음과 같이 `nlTest1.txt`라는 이름의 텍스트 파일 예를 참조하세요.

```
$ cat nlTest1.txt
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>|1000
<xml>
</xml>|2000
```

다음 예에서는 텍스트 처리 유틸리티를 실행하여 원본 파일을 전처리한 후 필요한 자리에 이스케이프 문자를 삽입할 수 있습니다. (`|` 문자는 원래 Amazon Redshift 테이블에 복사할 때 열 데이터의 구분자로 사용하기 위한 것입니다.) 

```
$ sed -e ':a;N;$!ba;s/>[[:space:]]*\n/>\\\n/g' nlTest1.txt > nlTest2.txt
```

마찬가지로 Perl을 사용하여 비슷한 작업을 실행할 수 있습니다.

```
cat nlTest1.txt | perl -p -e 's/>\s*\n/>\\\n/g' > nlTest2.txt
```

먼저 `nlTest2.txt` 파일의 데이터를 Amazon Redshift로 로드할 수 있도록에서 2열 테이블을 생성했습니다. 첫 번째 열인 c1은 `nlTest2.txt` 파일에서 XML 형식의 내용을 저장할 문자 열입니다. 두 번째 열인 c2에는 동일한 파일에서 로드되는 정수 값이 저장됩니다.

`sed` 명령을 실행한 후에는 ESCAPE 파라미터를 사용하여 `nlTest2.txt` 파일의 데이터를 Amazon Redshift 테이블로 정확하게 로드할 수 있습니다.

**참고**  
COPY 명령에 ESCAPE 파라미터를 추가하면 백슬래시 문자(줄 바꿈 문자 포함)를 포함하여 다수의 특수 문자가 이스케이프 처리됩니다.

```
copy t2 from 's3://amzn-s3-demo-bucket/data/nlTest2.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'  
escape
delimiter as '|';

select * from t2 order by 2;

c1           |  c2
-------------+------
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>
| 1000
<xml>
</xml>       | 2000
(2 rows)
```

유사한 방법으로 외부 데이터베이스에서 내보내는 데이터 파일도 준비할 수 있습니다. Oracle 데이터베이스를 예로 들면, 테이블에서 Amazon Redshift로 복사할 열마다 REPLACE 함수를 사용하면 됩니다.

```
SELECT c1, REPLACE(c2, \n',\\n' ) as c2 from my_table_with_xml
```

그 밖에 일반적으로 대용량 데이터를 처리하는 데이터베이스 내보내기 및 ETL(Extract, Transform, Load) 도구들도 대부분 이스케이프 및 구분자 문자를 지정하는 옵션이 있습니다.

## Amazon Redshift에 shapefile 로드
<a name="copy-example-spatial-copy-shapefile"></a>

다음 예에서는 COPY를 사용하여 Esri shapefile을 로드하는 방법을 보여줍니다. shapefile 로드에 대한 자세한 내용은 [Amazon Redshift에 shapefile 로드](spatial-copy-shapefile.md) 섹션을 참조하세요.

### shapefile 로드
<a name="copy-example-spatial-copy-shapefile-loading-copy"></a>

다음 단계에서는 COPY 명령을 사용하여 Amazon S3에서 OpenStreetMap 데이터를 수집하는 방법을 보여줍니다. 이 예에서는 [Geofabrik 다운로드 사이트](https://download.geofabrik.de/europe.html)의 Norway shapefile 아카이브가 해당 AWS 리전의 프라이빗 Amazon S3 버킷에 업로드되었다고 가정합니다. `.shp`, `.shx` 및 `.dbf` 파일은 동일한 Amazon S3 접두사와 파일 이름을 공유해야 합니다.

#### 단순화 없이 데이터 수집
<a name="spatial-copy-shapefile-loading-copy-fits"></a>

다음 명령은 단순화 없이 최대 지오메트리 크기에 맞는 테이블을 생성하고 데이터를 수집합니다. 선호하는 GIS 소프트웨어에서 `gis_osm_natural_free_1.shp`를 열고 이 계층의 열을 검사합니다. 기본적으로 IDENTITY 또는 GEOMETRY 열이 첫 번째 열입니다. GEOMETRY 열이 첫 번째 열이면 다음과 같이 테이블을 생성할 수 있습니다.

```
CREATE TABLE norway_natural (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

또는 IDENTITY 열이 첫 번째 열이면 다음과 같이 테이블을 생성할 수 있습니다.

```
CREATE TABLE norway_natural_with_id (
   fid INT IDENTITY(1,1),
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

이제 COPY를 사용하여 데이터를 수집할 수 있습니다.

```
COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO: Load into table 'norway_natural' completed, 83891 record(s) loaded successfully
```

또는 다음과 같이 데이터를 수집할 수 있습니다.

```
COPY norway_natural_with_id FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO: Load into table 'norway_natural_with_id' completed, 83891 record(s) loaded successfully.
```

#### 단순화와 함께 데이터 수집
<a name="spatial-copy-shapefile-loading-copy-no-fit"></a>

다음 명령은 단순화 없이 최대 지오메트리 크기에 맞지 않는 테이블을 생성하고 데이터 수집을 시도합니다. `gis_osm_water_a_free_1.shp` shapefile을 검사하고 다음과 같이 적절한 테이블을 생성합니다.

```
CREATE TABLE norway_water (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

COPY 명령이 실행되면 오류가 발생합니다.

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
ERROR:  Load into table 'norway_water' failed.  Check 'stl_load_errors' system table for details.
```

`STL_LOAD_ERRORS` 쿼리 결과 지오메트리가 너무 큽니다.

```
SELECT line_number, btrim(colname), btrim(err_reason) FROM stl_load_errors WHERE query = pg_last_copy_id();
 line_number |    btrim     |                                 btrim
-------------+--------------+-----------------------------------------------------------------------
     1184705 | wkb_geometry | Geometry size: 1513736 is larger than maximum supported size: 1048447
```

이를 극복하기 위해`SIMPLIFY AUTO` 파라미터가 COPY 명령에 추가되어 지오메트리를 단순화합니다.

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
SIMPLIFY AUTO
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';

INFO:  Load into table 'norway_water' completed, 1989196 record(s) loaded successfully.
```

단순화된 행과 지오메트리를 보려면 `SVL_SPATIAL_SIMPLIFY`를 쿼리합니다.

```
SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id();
 query | line_number | maximum_tolerance | initial_size | simplified | final_size |   final_tolerance
-------+-------------+-------------------+--------------+------------+------------+----------------------
    20 |     1184704 |                -1 |      1513736 | t          |    1008808 |   1.276386653895e-05
    20 |     1664115 |                -1 |      1233456 | t          |    1023584 | 6.11707814796635e-06
```

자동 계산된 것보다 낮은 허용치로 SIMPLIFY AUTO *max\$1tolerance*를 사용하면 수집 오류가 발생할 수 있습니다. 이 경우 MAXERROR를 사용하여 오류를 무시합니다.

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
SIMPLIFY AUTO 1.1E-05
MAXERROR 2
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';

INFO:  Load into table 'norway_water' completed, 1989195 record(s) loaded successfully.
INFO:  Load into table 'norway_water' completed, 1 record(s) could not be loaded.  Check 'stl_load_errors' system table for details.
```

`SVL_SPATIAL_SIMPLIFY`를 다시 쿼리하여 COPY가 로드하지 않은 레코드를 식별합니다.

```
SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id();
 query | line_number | maximum_tolerance | initial_size | simplified | final_size | final_tolerance
-------+-------------+-------------------+--------------+------------+------------+-----------------
    29 |     1184704 |           1.1e-05 |      1513736 | f          |          0 |               0
    29 |     1664115 |           1.1e-05 |      1233456 | t          |     794432 |         1.1e-05
```

이 예에서는 첫 번째 레코드가 맞지 않아 `simplified` 열이 false로 표시됩니다. 두 번째 레코드가 지정된 허용치 내에서 로드되었습니다. 그러나 최종 크기는 최대 허용치를 지정하지 않고 자동 계산된 허용치를 사용하는 것보다 큽니다.

### 압축된 shapefile에서 로드
<a name="copy-example-spatial-copy-shapefile-compressed"></a>

Amazon Redshift COPY는 압축된 shapefile에서 데이터 수집을 지원합니다. 모든 shapefile 구성 요소에는 동일한 Amazon S3 접두사와 동일한 압축 접미사가 있어야 합니다. 예를 들어 이전 예의 데이터를 로드하려고 한다고 가정합니다. 이 경우 파일 `gis_osm_water_a_free_1.shp.gz`, `gis_osm_water_a_free_1.dbf.gz`, 및 `gis_osm_water_a_free_1.shx.gz`는 동일한 Amazon S3 디렉터리를 공유해야 합니다. COPY 명령에는 GZIP 옵션이 필요하고 FROM 절은 다음과 같이 올바른 압축 파일을 지정해야 합니다.

```
COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/compressed/gis_osm_natural_free_1.shp.gz'
FORMAT SHAPEFILE
GZIP
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO:  Load into table 'norway_natural' completed, 83891 record(s) loaded successfully.
```

### 다른 열 순서로 테이블에 데이터 로드
<a name="copy-example-spatial-copy-shapefile-column-order"></a>

첫 번째 열이 `GEOMETRY`가 아닌 테이블이 있는 경우 열 매핑을 사용하여 열을 대상 테이블에 매핑할 수 있습니다. 예를 들어 `osm_id`가 첫 번째 열로 지정된 테이블을 생성합니다.

```
CREATE TABLE norway_natural_order (
   osm_id BIGINT,
   wkb_geometry GEOMETRY,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

그런 다음 열 매핑을 사용하여 shapefile을 수집합니다.

```
COPY norway_natural_order(wkb_geometry, osm_id, code, fclass, name) 
FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO:  Load into table 'norway_natural_order' completed, 83891 record(s) loaded successfully.
```

### 지오그래피 열이 있는 테이블에 데이터 로드
<a name="copy-example-spatial-copy-shapefile-geography"></a>

`GEOGRAPHY` 열이 있는 테이블이 있는 경우 먼저 열`GEOMETRY` 로 수집한 다음 객체를 `GEOGRAPHY` 객체로 캐스팅합니다. 예를 들어, shapefile을 `GEOMETRY` 열에 복사한 후 테이블을 변경하여 `GEOGRAPHY` 데이터 유형의 열을 추가합니다.

```
ALTER TABLE norway_natural ADD COLUMN wkb_geography GEOGRAPHY;
```

그런 다음 지오메트리를 지오그래피로 변환합니다.

```
UPDATE norway_natural SET wkb_geography = wkb_geometry::geography;
```

선택적으로 `GEOMETRY` 열을 삭제할 수 있습니다.

```
ALTER TABLE norway_natural DROP COLUMN wkb_geometry;
```

## NOLOAD 옵션을 사용한 CPPY 명령
<a name="r_COPY_command_examples-load-noload-option"></a>

실제로 데이터를 로드하기 전에 데이터 파일을 확인하려면 COPY 명령과 함께 NOLOAD 옵션을 사용합니다. Amazon Redshift Redshift는 입력 파일을 구문 분석하여 발생한 오류를 표시합니다. 다음 예제에서는 NOLOAD 옵션을 사용하며 실제로 테이블에 행이 로드되지 않습니다.

```
COPY public.zipcode1
FROM 's3://amzn-s3-demo-bucket/mydata/zipcode.csv' 
DELIMITER ';' 
IGNOREHEADER 1 REGION 'us-east-1'
NOLOAD
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/myRedshiftRole';

Warnings:
Load into table 'zipcode1' completed, 0 record(s) loaded successfully.
```

## 멀티바이트 구분 기호와 ENCODING 옵션을 포함한 COPY 명령
<a name="r_COPY_command_examples-load-encoding-multibyte-delimiter-option"></a>

다음 예제는 멀티바이트 데이터가 포함된 Amazon S3 파일에서 LATIN1을 로드합니다. COPY 명령은 구분 기호를 8진수 형식(`\302\246\303\254`)으로 지정하여 ISO-8859-1로 인코딩된 입력 파일의 필드를 구분합니다. UTF-8에서 동일한 구분 기호를 지정하려면 `DELIMITER '¦ì'`를 지정합니다.

```
COPY latin1
FROM 's3://amzn-s3-demo-bucket/multibyte/myfile' 
IAM_ROLE 'arn:aws:iam::123456789012:role/myRedshiftRole'
DELIMITER '\302\246\303\254'
ENCODING ISO88591
```