복잡한 중첩 JSON 직렬화 - Amazon Redshift

복잡한 중첩 JSON 직렬화

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

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

예를 들어 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 문자열을 포함하는 복합 형식 직렬화

기본적으로 중첩 컬렉션에 포함된 문자열 값은 이스케이프 처리된 JSON 문자열로 직렬화됩니다. 문자열이 유효한 JSON인 경우 이스케이프가 바람직하지 않을 수 있습니다. 대신 JSON으로 직접 VARCHAR인 중첩 하위 요소 또는 필드를 작성할 수 있습니다. json_serialization_parse_nested_strings 세션 수준 구성으로 이 동작을 사용합니다. json_serialization_enablejson_serialization_parse_nested_strings가 모두 설정되면 유효한 JSON 값이 이스케이프 문자 없이 인라인으로 직렬화됩니다. 값이 유효한 JSON이 아닌 경우 json_serialization_parse_nested_strings 구성 값이 설정되지 않은 것처럼 이스케이프 처리됩니다. 자세한 내용은 json_serialization_parse_nested_strings 단원을 참조하십시오.

예를 들어 이전 예의 데이터에서 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"}