Apache Iceberg™ 테이블의 데이터 타입¶
Snowflake는 Apache Iceberg™ 사양 에 정의된 대부분의 데이터 타입을 지원하고, Snowflake를 카탈로그로 사용할 때 Iceberg 테이블이 다양한 컴퓨팅 엔진 간에 상호 운용 가능한 상태로 유지되도록 Iceberg 데이터 타입을 테이블 파일에 기록합니다.
Snowflake가 지원하는 Iceberg 데이터 타입의 개요는 지원되는 데이터 타입 섹션을 참조하십시오.
근사 유형¶
테이블에서 Snowflake가 정확한 일치 를 지원하지 않는 Iceberg 데이터 타입을 사용하는 경우 Snowflake는 근사 Snowflake 유형을 사용합니다. 이 유형 매핑은 Snowflake를 카탈로그로 사용하는 변환된 테이블과 Iceberg 테이블의 열 값에 영향을 줍니다.
예를 들어 Iceberg 유형 int 의 열이 있는 테이블을 생각해 보겠습니다. Snowflake는 Snowflake 데이터 타입 NUMBER(10,0)을 사용하여 열 값을 처리합니다.
NUMBER(10,0)의 범위는 (-9,999,999,999, +9,999,999,999)이지만 int 의 범위는 (-2,147,483,648, +2,147,483,647)로 더욱 제한됩니다. 그 열에 3,000,000,000이라는 값을 삽입하려고 하면 Snowflake에서 범위 이탈을 알리는 오류 메시지를 반환합니다.
근사 유형에 대한 자세한 내용은 지원되는 데이터 타입 표의 참고 사항을 참조하십시오.
지원되는 데이터 타입¶
이 섹션의 테이블은 Iceberg 데이터 타입과 Snowflake 데이터 타입 간의 관계를 보여줍니다. 이러한 데이터 타입이 사용하는 열은 다음과 같습니다.
- Iceberg 유형:
Apache Iceberg 사양에 정의된 데이터 타입입니다. Snowflake를 카탈로그로 사용할 경우 Snowflake는 테이블 데이터 파일에 Iceberg 유형을 기록하므로 테이블이 다양한 컴퓨팅 엔진에 걸쳐 상호 운용 가능한 상태로 유지됩니다.
- Snowflake 유형:
테이블 데이터를 처리하고 반환하는 데 사용되는 Snowflake 데이터 타입입니다. 예를 들어 스키마가 Iceberg 유형
timestamp를 지정하는 경우 Snowflake는 Snowflake 데이터 타입 TIMESTAMP_NTZ(6)을 사용하여 마이크로초 정밀도로 값을 처리하고 반환합니다.- 참고:
근사 유형 작업에 대한 참고 사항을 포함한 추가적인 사용법 노트.
숫자형 타입¶
카탈로그로서의 Snowflake¶
다음 테이블은 Snowflake를 Iceberg 카탈로그로 사용하는 테이블(Snowflake 관리 테이블)의 경우 Iceberg 숫자형 데이터 타입이 Snowflake 숫자형 데이터 타입에 매핑되는 방식을 보여줍니다. Snowflake 관리 Iceberg 테이블을 만들 때, 숫자 열을 정의하기 위해 Iceberg 데이터 타입 을 사용할 수 있습니다.
Iceberg 데이터 타입 |
Snowflake 데이터 타입 |
참고 |
|---|---|---|
|
최소값보다 작거나 최대 32비트 부호 있는 정수 값보다 큰 10자리 숫자를 삽입하면 범위 이탈 오류가 발생합니다. |
|
|
최소값보다 작거나 최대 64비트 부호 있는 정수 값보다 큰 19자리 숫자를 삽입하면 범위 이탈 오류가 발생합니다. |
|
|
Snowflake DOUBLE 데이터 타입과 동의어입니다. Snowflake는 모든 부동 소수점 숫자를 배정밀도 64비트 부동 소수점 숫자로 처리하지만, Iceberg 부동 소수점 숫자를 테이블 데이터 파일에 32비트 부동 소수점 숫자로 기록합니다. 64비트에서 32비트로 변환 범위를 좁히면 정밀도가 손실됩니다. 기본 키로 |
|
|
Snowflake DOUBLE 데이터 타입과 동의어입니다. Snowflake는 모든 부동 소수점 숫자를 배정밀도 64비트 부동 소수점 숫자로 처리합니다. 64비트에서 32비트로 변환 범위를 좁히면 정밀도가 손실됩니다. 기본 키로 |
|
|
|
외부 카탈로그¶
외부 Iceberg 카탈로그를 사용하는 Iceberg 테이블을 만들면 다음 테이블에 따라 Iceberg 숫자 유형이 Snowflake 숫자 유형에 매핑됩니다.
Iceberg 데이터 타입 |
Snowflake 데이터 타입 |
|---|---|
|
|
|
|
|
|
|
|
|
참고
기본 키로 float 또는 double 를 사용할 수 없습니다(Apache Iceberg 사양 에 따라).
기타 데이터 타입¶
참고
숫자가 아닌 데이터 타입의 경우, Snowflake를 카탈로그로 사용하는 경우 테이블 DDL 에 Snowflake 데이터 타입을 지정하십시오(예: list 타입이 아닌 정형 ARRAY 사용). Snowflake는 외부 Iceberg 도구와의 상호 운용성을 위해 각 Snowflake 유형을 테이블 메타데이터의 해당 Iceberg 데이터 타입에 자동으로 매핑합니다.
Iceberg 데이터 타입 |
Snowflake 데이터 타입 |
참고 |
|---|---|---|
|
||
|
||
|
Apache Iceberg 테이블 사양에 따른 마이크로초 전체 자릿수입니다. |
|
|
Apache Iceberg 테이블 사양에 따른 마이크로초 전체 자릿수입니다. Parquet 물리적 유형 |
|
|
Apache Iceberg 테이블 사양에 따른 마이크로초 전체 자릿수입니다. Parquet 물리적 유형 |
|
|
기본 크기는 128MB이며, 명시적으로 지정할 수 있는 유일한 크기는 134217728(128MB)입니다. |
|
|
||
|
정형 유형 열은 최대 1,000개의 하위 열을 지원합니다. |
|
|
정형 유형 열은 최대 1,000개의 하위 열을 지원합니다. |
|
|
정형 유형 열은 최대 1,000개의 하위 열을 지원합니다. |
Iceberg v3 데이터 타입¶
중요
Iceberg v3 데이터 타입을 사용하려면 Iceberg 테이블이 준수하는 Apache Iceberg™ 사양의 버전을 3`으로 지정해야 합니다. 버전 지정 방법에 대한 지침은 :ref:`tables-iceberg-configuring-default-version 섹션을 참조하세요.
다음 테이블은 Iceberg 테이블과 함께 사용할 수 있는 Apache Iceberg™ v3 데이터 타입을 보여줍니다.
Iceberg 데이터 타입 |
Snowflake 데이터 타입 |
참고 |
|---|---|---|
|
|
Snowflake는 Apache Iceberg™ 테이블 </user-guide/tables-iceberg>`에서 :ref:`label-data_types_geography`를 지원합니다. GEOGRAPHY 열을 사용하여 Snowflake 관리 또는 외부 관리 Iceberg 테이블을 생성할 수 있습니다. GEOGRAPHY 열로 Iceberg 테이블을 생성하려면 :doc:/sql-reference/sql/create-iceberg-table` 명령을 사용합니다. 조심 Iceberg는 WKB 형식을 사용하여 지리 데이터를 저장합니다. 이 형식은 Snowflake GEOGRAPHY 값에 포함될 수 있는 모든 데이터를 나타낼 수는 없습니다. GEOGRAPHY 오브젝트의 경우 SRID는 항상 4326입니다. |
|
|
Snowflake는 Apache Iceberg™ 테이블 </user-guide/tables-iceberg>`에서 :ref:`label-data_types_geometry`를 지원합니다. GEOMETRY 열을 사용하여 Snowflake 관리 또는 외부 관리 Iceberg 테이블을 생성할 수 있습니다. GEOMETRY 열로 Iceberg 테이블을 생성하려면 :doc:/sql-reference/sql/create-iceberg-table` 명령을 사용합니다. 참고 단일 열에 있는 모든 GEOMETRY 오브젝트의 SRID는 동일합니다. |
|
|
Apache Iceberg 테이블 사양에 따른 나노초 전체 자릿수입니다. 타임존 의미 체계가 없습니다(벽시계). TIMESTAMP(9)는 Snowflake 매개 변수 :ref:`label-timestamp_type_mapping`의 값에 따라 먼저 TIMESTAMP_NTZ(9) 또는 TIMESTAMP_LTZ (9) Snowflake 유형에 매핑됩니다. 그런 다음 적절한 Iceberg 데이터 타입에 매핑됩니다. |
|
|
Apache Iceberg 테이블 사양에 따른 나노초 전체 자릿수입니다. UTC로 저장됩니다. TIMESTAMP(9)는 Snowflake 매개 변수 :ref:`label-timestamp_type_mapping`의 값에 따라 먼저 TIMESTAMP_NTZ(9) 또는 TIMESTAMP_LTZ (9) Snowflake 유형에 매핑됩니다. 그런 다음 적절한 Iceberg 데이터 타입에 매핑됩니다. |
|
Snowflake는 처음에 표준 Snowflake 테이블에 대해 VARIANT 데이터 타입을 개발했습니다. VARIANT는 JSON, Avro, Protobuf와 같은 동적 반정형 데이터에 대한 효율적인 이진 인코딩을 제공하여 다른 중첩 데이터 타입이 포함된 데이터로 더 쉽게 작업하고 운영할 수 있습니다. 자세한 내용은 반정형 데이터 타입 및 Introduction to loading semi-structured data 섹션을 참조하십시오. 파쇄 Snowflake는 VARIANT 데이터 타입에 대해 파쇄(또는 하위 열화)를 기본 제공합니다. 파쇄는 필드를 VARIANT 타입 열에서 별도의 필드로 추출하고 특수 표기법을 사용하여 탐색 및 쿼리할 수 있는 열 형식(하위 열)으로 각 필드를 저장하는 프로세스입니다. Snowflake는 파쇄된 하위 열에 대한 메타데이터와 통계를 추적하므로 더 빠르고 효율적인 쿼리를 위해 정리할 수 있습니다. VARIANT 열에 반정형 데이터를 삽입하는 경우 Snowflake는 가능한 한 많은 데이터를 파쇄합니다. 자세한 내용은 반정형 데이터 파일 및 하위 컬럼화 섹션을 참조하십시오. |
Iceberg v3 데이터 타입에 대한 고려 사항¶
Iceberg v3 데이터 타입을 사용할 때는 다음 사항을 고려하세요.
나노초 타임스탬프
nanosecond timestamps데이터 타입에 대한 사용법 노트:CREATE ICEBERG TABLE 및 ALTER ICEBERG TABLE 문에 TIMESTAMP_NTZ(9) ,TIMESTAMP_LTZ(9) 또는 TIMESTAMP(9)를 사용합니다. ``9``의 소수 자릿수는 새로운 Iceberg 나노초 유형을 지정합니다. ``6``의 소수 자릿수는 계속해서 레거시 마이크로초 유형을 지정합니다.
소수 자릿수가 생략되면 세션 수준 매개 변수 :code:`ICEBERG_TIMESTAMP_DEFAULT_SCALE`이 전체 자릿수를 제어합니다. 호환성을 위해 기본값은 ``6``으로 유지됩니다. Iceberg 타임스탬프 열의 기본값을 나노초로 설정하려면 매개 변수를 ``9``로 설정합니다.
모든 표준 Iceberg 파티션 변환(예: ID, 버킷, 연도, 월, 일, 시간)은 마이크로초 베리언트와 똑같이 새로운 나노초 유형을 허용합니다.
호환성
읽기/쓰기 - 읽기 및 쓰기 작업은 Snowflake 관리 Iceberg 테이블 및 외부 관리 Iceberg 테이블 모두에 지원됩니다.
외부 도구 - 커넥터를 변경할 필요가 없습니다. 나노초 값은 표준 Iceberg
timestamp_ns및timestamptz_ns값으로 읽기 및 쓰기 작업에 사용됩니다.
VARIANT
Iceberg 테이블이 있는
VARIANT데이터 타입을 사용할 때는 다음 고려 사항과 제한 사항을 고려하세요.
Iceberg 데이터 타입에 대한 일반적인 고려 사항은 VARIANT 데이터 타입에 적용됩니다. 자세한 내용은 :ref:`Iceberg 테이블의 데이터 타입 작업 시 고려 사항 <label-tables_iceberg_data_types_considerations>`을 참조하세요.
VARIANT 열의 오브젝트에 대한 키는 STRING 유형이어야 합니다.
Snowpipe 또는 COPY INTO를 사용하여 베리언트 열이 있는 Iceberg 테이블에 데이터를 로드하는 기능이 지원됩니다. 그러나 Snowpipe 및 COPY INTO를 사용하여 중첩된 베리언트 열이 포함된 OBJECT, ARRAY, MAP에 데이터를 로드할 수는 없습니다.
중첩된 베리언트는 지원되지 않습니다.
VARIANT 로 저장된 반정형 데이터에 대한 고려 사항 섹션을 참조하세요.
예¶
다음 섹션에는 Iceberg v3 데이터 타입에 대한 예제가 포함되어 있습니다.
GEOGRAPHY¶
GEOGRAPHY 열에 데이터를 삽입하려면 입력 데이터를 지정합니다. 다음 예제에서는 잘 알려진 텍스트(WKT)로 정의된 지리 공간 오브젝트를 이전 예제에서 생성한 geog_points 테이블의 geog 열에 삽입합니다.
INSERT INTO geog_points
SELECT TO_GEOGRAPHY('POINT(-122.3861109 37.61637595)');
GEOGRAPHY 값을 명시적으로 구성하지 않고도 지리 공간 데이터를 삽입할 수도 있습니다.
INSERT INTO geog_points
SELECT 'POINT(-122.3861109 37.61637595)';
GEOMETRY¶
다음 예제에서는 기본값 SRID가 ``4326``인 ``geom``이라는 단일 GEOMETRY 열이 포함된 빈 Iceberg 테이블을 생성합니다.
CREATE ICEBERG TABLE geo_points (geom GEOMETRY)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'my_external_volume'
BASE_LOCATION = 'us_states'
ICEBERG_VERSION = 3;
DDL 문에서 SRID를 명시적으로 설정할 수도 있습니다. 다음 예제에서는 SRID를 ``4269``로 설정합니다.
CREATE ICEBERG TABLE geo_points (geom GEOMETRY(4269))
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'my_external_volume'
BASE_LOCATION = 'us_states'
ICEBERG_VERSION = 3;
GEOMETRY 열에 데이터를 삽입하려면 입력 데이터를 지정합니다. 다음 예제에서는 잘 알려진 텍스트(WKT)로 정의된 지리 공간 오브젝트를 이전 예제에서 생성한 geo_points 테이블의 geom 열에 삽입합니다.
INSERT INTO geo_points
SELECT TO_GEOMETRY('POINT(-122.3861109 37.61637595)');
GEOMETRY 값을 명시적으로 구성하지 않고도 지리 공간 데이터를 삽입할 수도 있습니다.
INSERT INTO geo_points
SELECT 'POINT(-122.3861109 37.61637595)';
SRID를 GEOMETRY의 일부로 사용할 수 없는 경우 생성자 함수를 사용하여 명시적으로 설정할 수 있습니다.
INSERT INTO geo_points
SELECT TO_GEOMETRY('POINT(-122.3861109 37.61637595)', 4326);
나노초 타임스탬프¶
다음 예제에서는 나노초 타임스탬프가 있는 관리형 Iceberg 테이블을 생성합니다.
CREATE ICEBERG TABLE sensor_readings (
reading_ntz TIMESTAMP_NTZ(9),
reading_ltz TIMESTAMP_LTZ(9))
ICEBERG_VERSION = 3;
이 문에 대해 Snowflake는 다음 데이터 타입 매핑을 수행합니다.
reading_ntz열의 데이터 타입은timestamp_nsIceberg v3 데이터 타입에 매핑됩니다.reading_ltz열의 데이터 타입은timestamptz_nsIceberg v3 데이터 타입에 매핑됩니다.
VARIANT¶
CREATE ICEBERG TABLE 명령을 사용하여 VARIANT 열이 있는 Iceberg 테이블을 생성할 수 있습니다.
다음 예제에서는 ``record``라는 단일 VARIANT 열이 포함된 빈 Snowflake 관리 Iceberg 테이블을 생성합니다.
CREATE ICEBERG TABLE car_sales (record VARIANT)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'my_external_volume'
BASE_LOCATION = 'car_sales'
ICEBERG_VERSION = 3;
마찬가지로, 다음 예제에서는 Snowflake가 쓸 수 있는 카탈로그 연결 데이터베이스에 외부 관리 빈 Iceberg 테이블을 생성합니다.
USE DATABASE my_catalog_linked_db;
USE SCHEMA my_namespace;
CREATE ICEBERG TABLE car_sales (record VARIANT)
ICEBERG_VERSION = 3;
VARIANT 열에 데이터를 삽입하려면 입력 데이터 형식을 지정합니다. 다음 예제에서는 PARSE_JSON 함수를 사용하여 이전에 생성된 car_sales 테이블의 record 열에 JSON 형식의 데이터를 삽입합니다.
INSERT INTO car_sales SELECT
PARSE_JSON(
'{
"date" : "2017-04-28",
"dealership" : "Valley View Auto Sales",
"salesperson" : {
"id": "55",
"name": "John Salesperson"
},
"customer" : [
{"name": "Alice Doe", "phone": "14151234567", "address": "San Francisco, CA"},
{"name": "Bob Doe", "phone": "14151234567", "address": "San Francisco, CA"}
],
"vehicle" : [
{"make": "Honda", "model": "Civic", "year": "2017", "price": "20275", "extras":["ext warranty", "paint protection"]}
]
}'
);
테이블에서 SELECT * FROM 문을 실행하면 다음 출력을 반환합니다.
+--------------------------------------------+
| RECORD |
|--------------------------------------------|
| { |
| "customer": [ |
| { |
| "address": "San Francisco, CA", |
| "name": "Alice Doe", |
| "phone": "14151234567" |
| }, |
| { |
| "address": "San Francisco, CA", |
| "name": "Bob Doe", |
| "phone": "14151234567" |
| } |
| ], |
| "date": "2017-04-28", |
| "dealership": "Valley View Auto Sales", |
| "salesperson": { |
| "id": "55", |
| "name": "John Salesperson" |
| }, |
| "vehicle": [ |
| { |
| "extras": [ |
| "ext warranty", |
| "paint protection" |
| ], |
| "make": "Honda", |
| "model": "Civic", |
| "price": "20275", |
| "year": "2017" |
| } |
| ] |
| } |
+--------------------------------------------+
VARIANT 열의 데이터를 쿼리하려면 점 또는 대괄호 표기법을 사용하여 데이터에 중첩된 요소에 액세스하면 됩니다.
다음 예제에서는 점 표기법을 사용하여 자동차를 판매한 모든 영업사원의 이름을 가져옵니다. 테이블에는 하나의 행이 있으므로 쿼리는 단일 결과 값을 생성합니다.
SELECT record:salesperson.name
FROM car_sales
ORDER BY 1;
출력:
+-------------------------+
| RECORD:SALESPERSON.NAME |
|-------------------------|
| "John Salesperson" |
+-------------------------+
반정형 데이터 쿼리에 대한 자세한 내용은 반정형 데이터 쿼리하기 섹션을 참조하세요.
참고
Apache Spark를 사용하여 베리언트 열이 있는 Iceberg 테이블을 읽거나 쓸 때 베리언트 지원이 포함된 Apache Spark 4.0 이상을 사용해야 합니다.
Snowflake 관리 Iceberg 테이블의 베리언트 열은 Apache Spark와 같이 Iceberg 베리언트를 지원하는 엔진에서 읽을 수 있습니다. 엔진은 :doc:`Horizon Iceberg REST 카탈로그 API </user-guide/tables-iceberg-query-using-external-query-engine-snowflake-horizon>`를 통해 Snowflake 관리 Iceberg v3 테이블을 읽을 수 있습니다.
spark.sql(""" SELECT variant_get(record, '$.customer[0].name', 'string') AS customer_1_name variant_get(record, '$.salesperson.name', 'string') AS name FROM CAR_SALES ORDER BY name """).show()
마찬가지로, Snowflake는 베리언트 열이 포함된 외부 관리 Iceberg 테이블을 읽거나 쓸 수 있습니다.
Snowflake는 필요한 경우 테이블에 null 값을 쓸 수 있습니다.
예:
INSERT INTO my_table_new SELECT ARRAY_CONSTRUCT( OBJECT_CONSTRUCT_KEEP_NULL('field1', NULL, 'field2', 123) )::ARRAY(OBJECT(field1 STRING, field2 INT));
델타 데이터 타입¶
다음 테이블은 Delta 테이블 파일에서 생성된 Iceberg 테이블 에 대해 Delta 데이터 타입이 Snowflake 데이터 타입에 매핑되는 방법을 보여줍니다.
델타 유형 |
Snowflake 데이터 타입 |
참고 |
|---|---|---|
BINARY |
BINARY |
|
BOOLEAN |
BOOLEAN |
|
BYTE |
NUMBER(3,0) |
|
DATE |
DATE |
|
DECIMAL(P,S) |
NUMBER(P,S) |
|
DOUBLE |
REAL |
|
FLOAT |
REAL |
|
INTEGER |
NUMBER(10,0) |
|
LONG |
NUMBER(20,0) |
|
SHORT |
NUMBER(5,0) |
|
STRING |
TEXT |
|
TIMESTAMP |
TIMESTAMP_LTZ(6) |
Parquet 물리적 유형 |
TIMESTAMP_NTZ |
TIMESTAMP_NTZ(6) |
다음 테이블은 Delta 중첩 데이터 타입이 Snowflake 데이터 타입에 매핑되는 방식을 보여줍니다.
델타 중첩형 |
Snowflake 데이터 타입 |
|---|---|
STRUCT |
|
ARRAY |
|
MAP |
고려 사항¶
Iceberg 테이블의 데이터 타입으로 작업할 때 다음 항목을 고려하십시오.
다음 Iceberg 데이터 타입을 사용하는 열이 있는 테이블 변환 은 지원되지 않습니다.
uuidfixed(L)
Snowflake를 카탈로그로 사용하는 테이블의 경우 Iceberg
uuid데이터 타입을 사용하는 테이블 생성은 지원되지 않습니다.외부 카탈로그를 사용하는 테이블의 경우 OBJECT, ARRAY, MAP을 포함하는 정형화 타입 열이 있는 Iceberg v3 테이블을 생성할 수 없습니다. 예를 들어, CREATE ICEBERG TABLE … AS SELECT(CTAS)를 사용하여 정형화 타입 열이 있는 외부 관리 Iceberg v3 테이블을 생성할 수 없습니다.
정형화 타입 열이 있는 Snowflake 관리 Iceberg v3 테이블은 생성할 수 있습니다.
모든 Iceberg 테이블 유형의 경우:
정형 유형 열은 최대 1,000개의 하위 열을 지원합니다.
Iceberg는 시간 및 타임스탬프 유형에 대해 마이크로초 정밀도를 지원합니다. 결과적으로, Snowflake에서는 밀리초 또는 나노초와 같은 다른 정밀도를 사용하는 Iceberg 테이블을 만들 수 없습니다.
기본 키로
float또는double를 사용할 수 없습니다(Apache Iceberg 사양 에 따라).LIST논리 유형을 사용하는 Parquet 파일의 경우 다음 사항에 유의하십시오.element키워드가 포함된 3단계 주석 구조가 지원됩니다. 자세한 내용은 Parquet 논리 유형 정의 를 참조하십시오. Parquet 파일이array키워드와 함께 더 이상 사용되지 않는 형식을 사용하는 경우 지원되는 형식에 따라 데이터를 다시 생성해야 합니다.
델타 파일로 생성한 테이블의 경우 다음 사항에 유의하십시오.
다음 특징이나 데이터 타입을 사용하는 Parquet 파일(Delta 테이블의 데이터 파일)은 지원되지 않습니다.
필드 ID.
INTERVAL 데이터 타입.
전체 자릿수가 38개보다 많은 DECIMAL 데이터 타입.
1단계 또는 2단계 표현을 사용하는 LIST 또는 MAP 타입.
부호 없는 정수 타입(INT(부호 있음 = false)).
FLOAT16 데이터 타입.
Parquet 물리적 유형
int96을 TIMESTAMP 에 사용할 수 있지만, Snowflake는int96을 TIMESTAMP_NTZ 에 지원하지 않습니다.