

 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 직렬화
<a name="serializing-complex-JSON"></a>

이 주제에서는 중첩된 데이터를 JSON 형식으로 직렬화하는 방법을 보여줍니다. 중첩 데이터는 중첩된 필드를 포함하는 데이터입니다. 중첩 필드는 배열, 구조체 또는 객체와 같은 단일 엔터티로 함께 조인되는 필드입니다.

이 튜토리얼에서 설명하는 방법의 대안으로 최상위 중첩 컬렉션 열을 직렬화된 JSON으로 쿼리할 수 있습니다. 직렬화를 사용하여 Redshift Spectrum에서 중첩 데이터를 JSON으로 검사, 변환 및 수집할 수 있습니다. 이 방법은 ORC, JSON, Ion 및 Parquet 형식에 대해 지원됩니다. 세션 구성 파라미터 `json_serialization_enable`을 사용하여 직렬화 동작을 구성합니다. 설정하면 복잡한 JSON 데이터 형식이 VARCHAR(65535)로 직렬화됩니다. 중첩 JSON은 [JSON 함수](json-functions.md)로 액세스할 수 있습니다. 자세한 내용은 [json\$1serialization\$1enable](r_json_serialization_enable.md) 섹션을 참조하세요.

예를 들어 `json_serialization_enable`을 설정하지 않으면 중첩 열에 직접 액세스하는 다음 쿼리가 실패합니다.

```
SELECT * FROM spectrum.customers LIMIT 1;

=> ERROR:  Nested tables do not support '*' in the SELECT clause.

SELECT name FROM spectrum.customers LIMIT 1;

=> ERROR:  column "name" does not exist in customers
```

`json_serialization_enable`을 설정하면 최상위 컬렉션을 직접 쿼리할 수 있습니다.

```
SET json_serialization_enable TO true;

SELECT * FROM spectrum.customers order by id LIMIT 1;

id | name                                 | phones         | orders
---+--------------------------------------+----------------+----------------------------------------------------------------------------------------------------------------------
1  | {"given": "John", "family": "Smith"} | ["123-457789"] | [{"shipdate": "2018-03-01T11:59:59.000Z", "price": 100.50}, {"shipdate": "2018-03-01T09:10:00.000Z", "price": 99.12}]          
 
SELECT name FROM spectrum.customers order by id LIMIT 1;

name
---------
{"given": "John", "family": "Smith"}
```

중첩 JSON을 직렬화할 때 다음 항목을 고려합니다.
+ 컬렉션 열이 VARCHAR(65535)로 직렬화되면 쿼리 구문의 일부로(예: 필터 절에서) 중첩 하위 필드에 직접 액세스할 수 없습니다. 그러나 JSON 함수를 사용하여 중첩 JSON에 액세스할 수 있습니다.
+ 다음과 같은 특수 표현은 지원되지 않습니다.
  + ORC 조합
  + 복합 형식 키가 있는 ORC 맵
  + Ion 데이터그램
  + Ion SEXP
+ 타임스탬프는 ISO 직렬화 문자열로 반환됩니다.
+ 기본 맵 키는 문자열로 승격됩니다(예: `1`에서 `"1"`로).
+ 최상위 null 값은 NULL로 직렬화됩니다.
+ 직렬화가 최대 VARCHAR 크기인 65535를 넘으면 셀이 NULL로 설정됩니다.

## JSON 문자열을 포함하는 복합 형식 직렬화
<a name="serializing-complex-JSON-strings"></a>

기본적으로 중첩 컬렉션에 포함된 문자열 값은 이스케이프 처리된 JSON 문자열로 직렬화됩니다. 문자열이 유효한 JSON인 경우 이스케이프가 바람직하지 않을 수 있습니다. 대신 JSON으로 직접 VARCHAR인 중첩 하위 요소 또는 필드를 작성할 수 있습니다. `json_serialization_parse_nested_strings` 세션 수준 구성으로 이 동작을 사용합니다. `json_serialization_enable`과 `json_serialization_parse_nested_strings`가 모두 설정되면 유효한 JSON 값이 이스케이프 문자 없이 인라인으로 직렬화됩니다. 값이 유효한 JSON이 아닌 경우 `json_serialization_parse_nested_strings` 구성 값이 설정되지 않은 것처럼 이스케이프 처리됩니다. 자세한 내용은 [json\$1serialization\$1parse\$1nested\$1strings](r_json_serialization_parse_nested_strings.md) 섹션을 참조하세요.

예를 들어 이전 예의 데이터에서 `name` VARCHAR(20) 필드에 `structs` 복합 형식으로 JSON이 포함되어 있다고 가정합니다.

```
name
---------
{"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}
```

`json_serialization_parse_nested_strings`가 설정되면 `name` 열은 다음과 같이 직렬화됩니다.

```
SET json_serialization_enable TO true;
SET json_serialization_parse_nested_strings TO true;
SELECT name FROM spectrum.customers order by id LIMIT 1;

name
---------
{"given": {"first":"John","middle":"James"}, "family": "Smith"}
```

다음과 같이 이스케이프 처리되는 대신

```
SET json_serialization_enable TO true;
SELECT name FROM spectrum.customers order by id LIMIT 1;

name
---------
{"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}
```