

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

# 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 파일의 예입니다. 달러 기호($)는 루트 레벨 구조를 나타냅니다.

```
{
    "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, 문자로 구분된 형식 또는 고정 너비 텍스트 파일을 사용합니다.