반정형 데이터

Redshift 입문

Jason Myers

Principal Architect

반정형 데이터

  • Redshift의 SUPER 타입에 저장
  • 형식별 전용 SQL 함수 제공
  • JSON은 반정형 데이터의 한 종류입니다
Redshift 입문

JSON 유효성 검사 함수

  • IS_VALID_JSON - 전체 JSON 객체의 유효성을 확인합니다
SELECT IS_VALID_JSON('{"one":1, "two":2}');
IS_VALID_JSON
=============
true
SELECT IS_VALID_JSON('{"one":1, "two":2');
IS_VALID_JSON
=============
false
  • IS_VALID_JSON_ARRAY - JSON 배열의 유효성을 확인합니다.
SELECT IS_VALID_JSON_ARRAY('{"one":1}')
IS_VALID_JSON_ARRAY
===================
false
SELECT IS_VALID_JSON_ARRAY('[1,2,3]')
IS_VALID_JSON_ARRAY
===================
true
Redshift 입문

JSON 객체에서 추출

  • JSON_EXTRACT_PATH_TEXT는 지정 경로의 값을 반환합니다
  • JSON 문자열/필드와 하나 이상의 경로 키를 받습니다
SELECT JSON_EXTRACT_PATH_TEXT('{"one":1, "two":2}', 'one');
JSON_EXTRACT_PATH_TEXT
======================
1
Redshift 입문

잘못된 JSON 파싱 시도

-- 형식이 올바르지 않은 JSON에서 경로 추출 시도
SELECT JSON_EXTRACT_PATH_TEXT('{"one":1, "two":2', 'one');
JSON parsing error
DETAIL:  
  =========================================
  error:  JSON parsing error
  code:      8001
  context:   invalid json object 
  query:     [child_sequence:'one']
  location:  funcs_json.hpp:202
  process:   padbmaster [pid=1073807529]
  =========================================
Redshift 입문

중첩 JSON 경로에서 추출

  • 여러 키 인수를 제공합니다
SELECT JSON_EXTRACT_PATH_TEXT('
         {
           "one_object":{
              "nested_three": 3, 
              "nested_four":4
           }, 
           "two":2
         }', 
         'one_object', 'nested_three');
JSON_EXTRACT_PATH_TEXT
======================
3
Redshift 입문

존재하지 않는 중첩 JSON 경로에서 추출

  • NULL을 반환합니다
    SELECT JSON_EXTRACT_PATH_TEXT('
           {
             "one_object":{
                "nested_three": 3, 
                "nested_four":4
             }, 
             "two":2
           }', 
           'two', 'nested_five');
    
JSON_EXTRACT_PATH_TEXT
======================
NULL
Redshift 입문

JSON 배열에서 추출

  • JSON_EXTRACT_ARRAY_ELEMENT_TEXT는 배열 인덱스의 값을 반환합니다
  • JSON 문자열/필드와 0부터 시작하는 정수 인덱스를 받습니다.
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('[1.1,400,13]', 2);
JSON_EXTRACT_ARRAY_ELEMENT_TEXT
===============================
13
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('[1.1,400,13]', 3);
JSON_EXTRACT_ARRAY_ELEMENT_TEXT
===============================
NULL
Redshift 입문

중첩 JSON 배열에서 추출

SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT(
           JSON_EXTRACT_PATH_TEXT('
               {
                 "one":1, 
                 "nested_two":[3,4,5]
               }', 
               -- JSON_EXTRACT_PATH_TEXT로 nested_two의 값을 추출
               'nested_two'
            ),
            -- JSON_EXTRACT_ARRAY_ELEMENT_TEXT로 배열의 두 번째(인덱스 1) 요소 추출
            1
       );
JSON_EXTRACT_ARRAY_ELEMENT_TEXT
===============================
4
Redshift 입문

중첩 JSON 배열 추출 단축 방법

  • 배열 인덱스는 문자열이어야 합니다
-- 두 키('nested_two', '1')를 전달하여
-- nested_two 배열 값의 두 번째 요소 선택
SELECT JSON_EXTRACT_PATH_TEXT('
          {
            "one":1, 
            "nested_two":[3,4,5]
          }', 
          'nested_two', '1'
       );
JSON_EXTRACT_PATH_TEXT
======================
4
Redshift 입문

CTE에서 캐스팅

WITH location_details AS (
    SELECT '{
        "location": "Salmon Challis National Forest",
      }'::SUPER::VARCHAR AS data
) 
  • location_details.data로 접근 가능합니다
Redshift 입문

연습해 봅시다!

Redshift 입문

Preparing Video For Download...