반정형 데이터에 지원되는 형식¶
이 항목에서는 반정형 데이터에 지원되는 형식을 설명합니다.
이 항목의 내용:
Snowflake는 아래의 반정형 데이터 형식을 기본적으로 지원합니다. 특히, Snowflake는 COPY 명령에서 이러한 형식의 데이터 파일을 로딩하고 언로딩하는 옵션을 제공합니다.
JSON¶
JSON이란 무엇입니까?¶
JSON(JavaScript 오브젝트 표기법)는 JavaScript 프로그래밍 언어의 하위 세트를 기반으로 하는 경량의 일반 텍스트 데이터 교환 형식입니다.
JSON 데이터는 모든 애플리케이션에서 생성하는 것이 가능합니다. 공통적인 몇 가지 예는 다음과 같습니다.
기본 제공 메서드를 사용하여 JSON을 생성하는 JavaScript 애플리케이션.
라이브러리(일반적으로 확장 포함)를 사용하여 JSON 데이터를 생성하는 비 JavaScript 애플리케이션.
임시 JavaScript 생성기.
JSON 문서의 연결(줄로 구분되거나 구분되지 않을 수 있음).
공식 사양은 없으므로, 다양한 구현 사이에서 상당한 차이가 있습니다. 이러한 차이점으로 인해 JSON 파서에 엄격한 언어 정의가 적용되는 경우 JSON과 유사한 데이터 세트를 가져올 수 없습니다. 최대한 오류가 발생하지 않고 JSON 데이터 세트를 가져올 수 있도록, Snowflake는 “관대한”규칙을 따릅니다. 이를 통해 모호한 해석을 허용하는 가장 광범위한 JSON 및 JSON 유사 입력을 허용할 수 있습니다.
이 항목에서는 Snowflake에서 허용되는 JSON 문서에 대한 구문을 설명합니다.
JSON에 대한 자세한 내용은 json.org 를 참조하십시오.
기본 JSON 구문¶
JSON 데이터는 오브젝트와 배열로 그룹화된 이름/값 페어의 계층 구조 컬렉션입니다.
콜론
:
은 이름/값 페어에서 이름과 값을 구분합니다.중괄호
{}
는 오브젝트를 나타냅니다.대괄호
[]
는 배열을 나타냅니다.쉼표
,
는 오브젝트와 배열에서 엔터티를 구분합니다.
이름/값 페어¶
JSON 이름/값 페어는 필드 이름(큰따옴표로 묶음), 콜론, 값의 순서로 구성됩니다.
예:
{"firstName":"John", "empid":45611}
지원되는 데이터 타입¶
가능한 이름/값 페어의 값:
숫자(정수 또는 부동 소수점)
문자열(큰따옴표로 묶음)
부울(true 또는 false)
배열(대괄호로 묶음)
오브젝트(중괄호로 묶음)
Null
오브젝트¶
JSON 오브젝트는 중괄호로 묶어 작성됩니다. 오브젝트에는 쉼표로 구분된 여러 개의 이름/값 페어가 포함될 수 있습니다. 예:
{"firstName":"John", "lastName":"Doe"}
배열¶
JSON 배열은 대괄호로 묶어 작성됩니다. 베열에는 쉼표로 구분된 여러 개의 오브젝트가 포함될 수 있습니다. 예:
{"employees":[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]
}
JSON 문서의 예¶
FILE NAME: json_sample_data1
간단한 직원 레코드(오브젝트) 3개가 포함된 배열 포함:
{"root":[{"employees":[ {"firstName":"John", "lastName":"Doe"}, {"firstName":"Anna", "lastName":"Smith"}, {"firstName":"Peter", "lastName":"Jones"} ]}]}
FILE NAME: json_sample_data2
직원 레코드(오브젝트) 3개와 관련 종속 데이터(자녀, 자녀의 이름 및 나이, 직원이 거주한 도시, 해당 도시에서 직원이 거주한 연수)가 포함된 배열을 포함합니다.
{"root": [ { "kind": "person", "fullName": "John Doe", "age": 22, "gender": "Male", "phoneNumber": {"areaCode": "206", "number": "1234567"}, "children": [ { "name": "Jane", "gender": "Female", "age": "6" }, { "name": "John", "gender": "Male", "age": "15" } ], "citiesLived": [ { "place": "Seattle", "yearsLived": ["1995"] }, { "place": "Stockholm", "yearsLived": ["2005"] } ] }, {"kind": "person", "fullName": "Mike Jones", "age": 35, "gender": "Male", "phoneNumber": { "areaCode": "622", "number": "1567845"}, "children": [{ "name": "Earl", "gender": "Male", "age": "10"}, {"name": "Sam", "gender": "Male", "age": "6"}, { "name": "Kit", "gender": "Male", "age": "8"}], "citiesLived": [{"place": "Los Angeles", "yearsLived": ["1989", "1993", "1998", "2002"]}, {"place": "Washington DC", "yearsLived": ["1990", "1993", "1998", "2008"]}, {"place": "Portland", "yearsLived": ["1993", "1998", "2003", "2005"]}, {"place": "Austin", "yearsLived": ["1973", "1998", "2001", "2005"]}]}, {"kind": "person", "fullName": "Anna Karenina", "age": 45, "gender": "Female", "phoneNumber": { "areaCode": "425", "number": "1984783"}, "citiesLived": [{"place": "Stockholm", "yearsLived": ["1992", "1998", "2000", "2010"]}, {"place": "Russia", "yearsLived": ["1998", "2001", "2005"]}, {"place": "Austin", "yearsLived": ["1995", "1999"]}]} ] }
Avro¶
Avro란 무엇입니까?¶
Avro는 원래 Apache Hadoop과 함께 사용하기 위해 개발된 오픈 소스 데이터 직렬화 및 RPC 프레임워크로, JSON에 정의된 스키마를 활용하여 직렬화된 데이터를 압축된 바이너리 형식으로 생성합니다. 직렬화된 데이터를 모든 대상(즉, 애플리케이션 또는 프로그램)으로 전송할 수 있으며, 데이터에 스키마가 포함되어 있으므로 대상에서 편리하게 역직렬화를 수행할 수 있습니다.
Avro 스키마는 스키마 타입 및 스키마 타입에 대한 데이터 속성(필드 이름, 데이터 타입 등)을 정의하는 JSON 문자열, 오브젝트 또는 배열로 구성됩니다. 속성은 스키마 타입에 따라 다릅니다. 배열 및 맵과 같은 복잡한 데이터 타입이 지원됩니다.
Snowflake는 Avro 데이터를 단일 VARIANT 열로 해석합니다. 사용자는 유사한 명령 및 함수를 사용하여 JSON 데이터에서와 같이 VARIANT 열의 데이터를 쿼리할 수 있습니다.
자세한 내용은 avro.apache.org 를 참조하십시오.
Avro 스키마의 예¶
{
"type": "record",
"name": "person",
"namespace": "example.avro",
"fields": [
{"name": "fullName", "type": "string"},
{"name": "age", "type": ["int", "null"]},
{"name": "gender", "type": ["string", "null"]}
]
}
ORC¶
ORC란 무엇입니까?¶
ORC(Optimized Row Columnar)는 Hive 데이터를 저장하는 데 사용되는 이진 형식입니다. ORC는 이전의 Hive 파일 형식보다 데이터 읽기, 쓰기, 처리 성능을 개선하고 효율적으로 압축하기 위해 설계되었습니다. ORC에 대한 자세한 내용은 https://orc.apache.org/ 를 참조하십시오.
Snowflake는 ORC 데이터를 단일 VARIANT 열로 해석합니다. 사용자는 유사한 명령 및 함수를 사용하여 JSON 데이터에서와 같이 VARIANT 열의 데이터를 쿼리할 수 있습니다.
또는, CREATE TABLE AS SELECT 문을 사용하여 스테이징된 ORC 파일에서 열을 별도의 테이블 열로 추출할 수도 있습니다.
참고
맵 데이터는 오브젝트 배열로 역직렬화됩니다. 예:
"map": [{"key": "chani", "value": {"int1": 5, "string1": "chani"}}, {"key": "mauddib", "value": {"int1": 1, "string1": "mauddib"}}]
Union 데이터는 단일 오브젝트로 역직렬화됩니다. 예:
{"time": "1970-05-05 12:34:56.197", "union": {"tag": 0, "value": 3880900}, "decimal": 3863316326626557453.000000000000000000}
VARIANT 열에 로드된 ORC 데이터의 예¶
+--------------------------------------+
| SRC |
|--------------------------------------|
| { |
| "boolean1": false, |
| "byte1": 1, |
| "bytes1": "0001020304", |
| "decimal1": 12345678.654745, |
| "double1": -1.500000000000000e+01, |
| "float1": 1.000000000000000e+00, |
| "int1": 65536, |
| "list": [ |
| { |
| "int1": 3, |
| "string1": "good" |
| }, |
| { |
| "int1": 4, |
| "string1": "bad" |
| } |
| ] |
| } |
+--------------------------------------+
Parquet¶
Parquet이란 무엇입니까?¶
Parquet은 Hadoop 에코시스템의 프로젝트용으로 설계된 효율적인 압축 열 형식 데이터 표현입니다. 이 파일 형식은 복잡한 중첩 데이터 구조를 지원하고 Dremel 레코드 파쇄 및 어셈블리 알고리즘을 사용합니다. 자세한 내용은 parquet.apache.org/docs/ 를 참조하십시오.
참고
현재 Snowflake는 Parquet 작성기 v1을 사용하여 생성된 Parquet 파일의 스키마를 지원합니다. 작성기 v2를 사용하여 생성된 파일은 데이터 로딩에서 지원되지 않습니다.
Snowflake는 Parquet 데이터를 단일 VARIANT 열로 해석합니다. 사용자는 유사한 명령 및 함수를 사용하여 JSON 데이터에서와 같이 VARIANT 열의 데이터를 쿼리할 수 있습니다.
또는, CREATE TABLE AS SELECT 문을 사용하여 스테이징된 Parquet 파일에서 선택한 열을 별도의 테이블 열로 추출할 수도 있습니다.
Parquet은 바이너리 형식입니다. Parquet 파일의 예를 제공하는 것은 불가능합니다.
VARIANT 열에 로드된 Parquet 데이터의 예¶
+------------------------------------------+
| SRC |
|------------------------------------------|
| { |
| "continent": "Europe", |
| "country": { |
| "city": { |
| "bag": [ |
| { |
| "array_element": "Paris" |
| }, |
| { |
| "array_element": "Nice" |
| }, |
| { |
| "array_element": "Marseilles" |
| }, |
| { |
| "array_element": "Cannes" |
| } |
| ] |
| }, |
| "name": "France" |
| } |
| } |
+------------------------------------------+
XML¶
XML이란 무엇입니까?¶
XML(eXtensible Markup Language)은 문서를 인코딩하기 위한 일련의 규칙을 정의하는 마크업 언어입니다. 원래는 문서를 구성하는 구조 및 요소를 표준화하기 위해 개발된 다른 마크업 언어인 SGML을 기반으로 개발되었습니다.
도입 이후 XML은 초기의 문서 중심에서 확장되어 임의 데이터 구조의 표현 및 통신 프로토콜의 기본 언어 역할 등 광범위한 용도로 사용될 수 있도록 성장했습니다. XML은 확장성, 다목적성 및 유용성으로 인해 웹에서 가장 일반적으로 사용되는 데이터 교환 표준 중 1개로 자리잡고 있습니다.
XML 문서의 기본적인 구성 요소는 다음과 같습니다.
태그(꺾쇠괄호,
<
및>
으로 식별됨)요소
일반적으로 요소는 “시작” 태그와 일치하는 “종료” 태그로 구성되며, 태그 사이의 텍스트는 요소의 내용을 구성합니다. 또한, 요소는 “종료” 태그가 없는 “빈 요소” 태그로 구성될 수도 있습니다. “시작” 및 “빈 요소” 태그에는 요소의 속성 또는 메타데이터를 정의하기 위한 속성이 포함될 수도 있습니다.
XML 문서의 예¶
<?xml version="1.0"?>
<!DOCTYPE parts system "parts.dtd">
<?xml-stylesheet type="text/css" href="xmlpartsstyle.css"?>
<parts>
<title>Automobile Parts & Accessories</title>
<part>
<item>Spark Plugs</item>
<partnum>A3-400</partnum>
<price> 27.00</price>
</part>
<part>
<item>Motor Oil</item>
<partnum>B5-200</partnum>
<price> 14.00</price>
</part>
<part>
<item>Motor Oil</item>
<partnum>B5-300</partnum>
<price> 16.75</price>
</part>
<part>
<item>Engine Coolant</item>
<partnum>B6-120</partnum>
<price> 19.00</price>
</part>
<part>
<item>Engine Coolant</item>
<partnum>B6-220</partnum>
<price> 18.25</price>
</part>
</parts>