테이블 지원 및 스키마
테이블 지원 및 스키마
이 주제는 Snowpipe Streaming이 지원하는 테이블 타입, 데이터 타입, 스키마 기능을 다룹니다.
출처: Snowflake 문서
본문
Apache Iceberg™ 테이블 지원
Snowpipe Streaming은 Snowflake 관리형 Apache Iceberg™ 테이블 — Iceberg v2와 Iceberg v3 테이블을 모두 포함 — 로의 수집을 지원합니다. 자세한 내용은 고성능 아키텍처의 Snowpipe Streaming: Apache Iceberg™ 테이블 을 참고하세요.
스키마 진화
Snowpipe Streaming은 ENABLE_SCHEMA_EVOLUTION = TRUE로 설정된 테이블에서 테이블 스키마의 자동 진화를 지원합니다. Snowflake는 들어오는 스트림의 지원되는 새 최상위(top-level) 필드를 추론하고 해당 열을 추가합니다. 스키마 진화는 append가 내구성 있게 승인된 후 비동기적으로 발생합니다. Snowflake는 들어오는 행이 필수 열을 생략할 때 NOT NULL 제약 조건을 제거할 수도 있습니다. 자세한 내용은 테이블 스키마 진화 를 참고하세요.
스키마 진화의 제한 사항:
- 기존 열의 정밀도(precision), 스케일(scale), 또는 길이를 자동으로 증가시킬 수 없습니다.
- 표준 Snowflake 테이블의 경우 구조화 데이터 타입에 대해 스키마 진화가 지원되지 않습니다. 구조화 값을 포함하는 새 열은 대신 VARIANT로 추론됩니다.
- Snowflake 관리형 Iceberg 테이블의 경우 v2와 v3 모두 JSON 숫자, 불리언, 문자열, 날짜, 시간, 타임스탬프에서 추론된 새 최상위 열을 지원합니다.
- 중첩된 JSON 객체는 VARIANT로 추론되며 Iceberg v3에서만 열을 추가할 수 있습니다. VARIANT는 Iceberg v2에서 지원되지 않습니다.
- 목록(list)과 배열(array)은 Iceberg v2 또는 v3에서 열을 추가할 수 없습니다. 스키마 진화는 구조화된 ARRAY, OBJECT, 또는 MAP 열을 만들지 않습니다. 이러한 열은 테이블 생성 시 정의하세요.
- BINARY, GEOGRAPHY, GEOMETRY 열은 관리형 Iceberg 테이블에서 지원되지만 들어오는 JSON 값에서 추론되지는 않습니다. 테이블 생성 시 이러한 열을 정의하세요.
- 나노초 타임스탬프는 Iceberg v3가 필요합니다. Iceberg v2는 기본 스케일 강제 변환(default-scale coercion)이 활성화된 경우 마이크로초 정밀도로 값을 수집할 수 있으며, 그렇지 않으면 행이 거부됩니다.
- 관찰된 값이 null뿐인 새 필드는 VARCHAR로 추가됩니다.
- 외부 관리형 Iceberg 테이블과 외부 테이블은 지원되지 않습니다.
Insert-only 작업
API는 현재 행 삽입으로 제한됩니다. 데이터를 수정, 삭제, 결합하려면 "원시" 레코드를 하나 이상의 스테이징 테이블에 쓰세요. 연속 데이터 파이프라인 을 사용해 데이터를 병합, 조인, 변환해 수정된 데이터를 대상 보고 테이블에 삽입하세요.
지원되는 Java 데이터 타입
다음 표는 Snowflake 열로 수집하기 위해 지원되는 Java 데이터 타입을 요약합니다.
| Snowflake 열 타입 | 허용되는 Java 데이터 타입 |
|---|---|
| CHAR | |
| VARCHAR | String |
| 원시 데이터 타입 (int, boolean, char, …) | |
| BigInteger, BigDecimal | |
| BINARY | byte[] |
| String (hex-encoded) | |
| NUMBER | 숫자 타입 (BigInteger, BigDecimal, byte, int, double, …) |
| String | |
| FLOAT | 숫자 타입 (BigInteger, BigDecimal, byte, int, double, …) |
| String | |
| BOOLEAN | boolean |
| 숫자 타입 (BigInteger, BigDecimal, byte, int, double, …) | |
| String | |
| boolean 변환 세부 사항 참조. | |
| TIME | java.time.LocalTime |
| java.time.OffsetTime | |
| String |
정수 저장 시간
HH24:MI:SS.FFTZH:TZM (예: 20:57:01.123456789+07:00)
HH24:MI:SS.FF (예: 20:57:01.123456789)
HH24:MI:SS (예: 20:57:01)
HH24:MI (예: 20:57) |
| DATE | java.time.LocalDate
java.time.LocalDateTime
java.time.OffsetDateTime
java.time.ZonedDateTime
java.time.Instant
String
정수 저장 날짜
YYYY-MM-DD (예: 2013-04-28)
YYYY-MM-DDTHH24:MI:SS.FFTZH:TZM (예: 2013-04-28T20:57:01.123456789+07:00)
YYYY-MM-DDTHH24:MI:SS.FF (예: 2013-04-28T20:57:01.123456)
YYYY-MM-DDTHH24:MI:SS (예: 2013-04-28T20:57:01)
YYYY-MM-DDTHH24:MI (예: 2013-04-28T20:57)
YYYY-MM-DDTHH24:MI:SSTZH:TZM (예: 2013-04-28T20:57:01-07:00)
YYYY-MM-DDTHH24:MITZH:TZM (예: 2013-04-28T20:57-07:00) |
| TIMESTAMP_NTZ
TIMESTAMP_LTZ
TIMESTAMP_TZ | java.time.LocalDate
java.time.LocalDateTime
java.time.OffsetDateTime
java.time.ZonedDateTime
java.time.Instant
String
정수 저장 타임스탬프
YYYY-MM-DD (예: 2013-04-28)
YYYY-MM-DDTHH24:MI:SS.FFTZH:TZM (예: 2013-04-28T20:57:01.123456789+07:00)
YYYY-MM-DDTHH24:MI:SS.FF (예: 2013-04-28T20:57:01.123456)
YYYY-MM-DDTHH24:MI:SS (예: 2013-04-28T20:57:01)
YYYY-MM-DDTHH24:MI (예: 2013-04-28T20:57)
YYYY-MM-DDTHH24:MI:SSTZH:TZM (예: 2013-04-28T20:57:01-07:00)
YYYY-MM-DDTHH24:MITZH:TZM (예: 2013-04-28T20:57-07:00) |
| VARIANT
ARRAY | String (유효한 JSON이어야 함)
원시 데이터 타입 및 그 배열
BigInteger, BigDecimal
java.time.LocalTime
java.time.OffsetTime
java.time.LocalDate
java.time.LocalDateTime
java.time.OffsetDateTime
java.time.ZonedDateTime
java.util.Map (T는 유효한 VARIANT 타입)
T[] (T는 유효한 VARIANT 타입)
List