개요
지금까지 Snowflake 상에서 CSV 데이터를 주로 다루었다. 이번 글에서는 JSON 형식으로 반구조화된 데어티를 쿼리 하는 방법에 대해 적어둔다.
테스트 데이터 저장
author_with_header.json 파일을 Snowflake 데이터로 저장해보자. 이를 위해서는 VARIENT라는 형식의 컬럼을 포함하는 테이블을 생성해주어야 한다.
CREATE TABLE LIBRARY_CARD_CATALOG.PUBLIC.AUTHOR_INGEST_JSON_2
(
RAW_AUTHOR VARIANT
);
VARIENT 형식은 object나 array 등을 포함해 다른 유형의 값을 저장할 때 사용하는 데이터 타입이다. 압축되지 않은 데이터 기준으로 최대 16MB까지의 데이터를 저장할 수 있다.
테이블을 생성했다면 JSON 데이터를 처리하는 File Format을 생성한다.
CREATE FILE FORMAT LIBRARY_CARD_CATALOG.PUBLIC.JSON_FILE_FORMAT
TYPE = 'JSON'
COMPRESSION = 'AUTO'
ENABLE_OCTAL = FALSE
ALLOW_DUPLICATE = FALSE
STRIP_OUTER_ARRAY = TRUE
STRIP_NULL_VALUES = FALSE
IGNORE_UTF8_ERRORS = FALSE;
이제 file format을 사용하여 파일 데이터를 테이블에 저장한다.
COPY INTO LIBRARY_CARD_CATALOG.PUBLIC.AUTHOR_INGEST_JSON_2
FROM @util_db.public.like_a_window_into_an_s3_bucket
files = ( 'author_with_header.json' )
file_format = ( format_name=LIBRARY_CARD_CATALOG.PUBLIC.JSON_FILE_FORMAT );
이 테이블은 RAW_AUTHOR이라는 컬럼에 네 가지 속성이 저장되어 있는 상태이다.
{
"AUTHOR_UID": 1,
"FIRST_NAME": "Fiona",
"LAST_NAME": "Macdonald",
"MIDDLE_NAME": null
}
데이터 접근
Dot Notation (:)
VARIENT 데이터의 하위 속성은 Dot Notation을 사용하여 접근할 수 있다.
<column>:<level1_element>
<column>:"<level1_element>"."<level2_element>"
-- 예시
SELECT raw_author:AUTHOR_UID
FROM library_card_catalog.public.author_ingest_json_2;
Bracket Notation ([])
또는 Bracket Notation으로 접근할 수도 있다.
<column>['<level1_element>']['<level2_element>']
-- 예시
SELECT raw_author['FIRST_NAME']
FROM library_card_catalog.public.author_ingest_json_2;
데이터 형변환
VARIENT로 저장된 데이터를 숫자, 문자열 등의 데이터를 다른 유형의 데이터로 형변환 할 때는 :: 또는 CAST 함수를 사용한다. 반대로 값을 VARIANT로 변환할 때는 TO_VARIENT 함수를 사용한다.
SELECT raw_author:AUTHOR_UID::INT AS AUTHOR_UID
, raw_author['FIRST_NAME']::STRING as FIRST_NAME
, CAST(raw_author:MIDDLE_NAME AS STRING) as MIDDLE_NAME
, CAST(raw_author['LAST_NAME'] AS STRING) as LAST_NAME
FROM AUTHOR_INGEST_JSON;
참고 문서
https://docs.snowflake.com/en/sql-reference/data-types-semistructured#label-data-type-variant
https://docs.snowflake.com/en/user-guide/querying-semistructured#dot-notation
https://docs.snowflake.com/en/user-guide/querying-semistructured#bracket-notation
https://docs.snowflake.com/en/user-guide/querying-semistructured