CREATE EXTERNAL TABLE¶
현재/지정된 스키마에 새 외부 테이블을 만들거나 기존 외부 테이블을 대체합니다. 쿼리 시, 외부 테이블은 지정된 외부 스테이지에 있는 하나 이상의 파일 세트에서 데이터를 읽어 단일 VARIANT 열에 데이터를 출력합니다.
이름, 데이터 타입 그리고 선택적으로 열에 값(NOT NULL)이 필요한지 또는 참조 무결성 제약 조건(기본 키, 외래 키 등)이 있는지 여부로 구성된 각각의 열 정의를 사용하여 추가적인 열을 정의할 수 있습니다. 자세한 내용은 사용법 노트를 참조하십시오.
구문¶
-- Partitions computed from expressions
CREATE [ OR REPLACE ] EXTERNAL TABLE [IF NOT EXISTS]
<table_name>
( [ <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ]
[ inlineConstraint ]
[ , <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ... ]
[ , ... ] )
cloudProviderParams
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
[ WITH ] LOCATION = externalStage
[ REFRESH_ON_CREATE = { TRUE | FALSE } ]
[ AUTO_REFRESH = { TRUE | FALSE } ]
[ PATTERN = '<regex_pattern>' ]
FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET } [ formatTypeOptions ] } )
[ AWS_SNS_TOPIC = '<string>' ]
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON (VALUE) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
-- Partitions added and removed manually
CREATE [ OR REPLACE ] EXTERNAL TABLE [IF NOT EXISTS]
<table_name>
( [ <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ]
[ inlineConstraint ]
[ , <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ... ]
[ , ... ] )
cloudProviderParams
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
[ WITH ] LOCATION = externalStage
PARTITION_TYPE = USER_SPECIFIED
FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET } [ formatTypeOptions ] } )
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON (VALUE) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
-- Delta Lake
CREATE [ OR REPLACE ] EXTERNAL TABLE [IF NOT EXISTS]
<table_name>
( [ <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ]
[ inlineConstraint ]
[ , <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ... ]
[ , ... ] )
cloudProviderParams
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
[ WITH ] LOCATION = externalStage
PARTITION_TYPE = USER_SPECIFIED
FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET } [ formatTypeOptions ] } )
[ TABLE_FORMAT = DELTA ]
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON (VALUE) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
여기서
inlineConstraint ::= [ NOT NULL ] [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY | [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> ] ) ] } [ <constraint_properties> ]추가 인라인 제약 조건의 세부 정보는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오.
cloudProviderParams (for Google Cloud Storage) ::= [ INTEGRATION = '<integration_name>' ] cloudProviderParams (for Microsoft Azure) ::= [ INTEGRATION = '<integration_name>' ]externalStage ::= @[<namespace>.]<ext_stage_name>[/<path>]formatTypeOptions ::= -- If FILE_FORMAT = ( TYPE = CSV ... ) COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE RECORD_DELIMITER = '<character>' | NONE FIELD_DELIMITER = '<character>' | NONE SKIP_HEADER = <integer> SKIP_BLANK_LINES = TRUE | FALSE ESCAPE_UNENCLOSED_FIELD = '<character>' | NONE TRIM_SPACE = TRUE | FALSE FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | NONE NULL_IF = ( '<string1>' [ , '<string2>' , ... ] ) EMPTY_FIELD_AS_NULL = TRUE | FALSE ENCODING = '<string>' -- If FILE_FORMAT = ( TYPE = JSON ... ) COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE ALLOW_DUPLICATE = TRUE | FALSE STRIP_OUTER_ARRAY = TRUE | FALSE STRIP_NULL_VALUES = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE -- If FILE_FORMAT = ( TYPE = AVRO ... ) COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE REPLACE_INVALID_CHARACTERS = TRUE | FALSE -- If FILE_FORMAT = ( TYPE = ORC ... ) TRIM_SPACE = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE NULL_IF = ( '<string>' [ , '<string>' ... ] -- If FILE_FORMAT = ( TYPE = PARQUET ... ) COMPRESSION = AUTO | SNAPPY | NONE BINARY_AS_TEXT = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE
베리언트 구문¶
CREATE EXTERNAL TABLE … USING TEMPLATE¶
반정형 데이터를 포함하는 스테이징된 파일 세트에서 파생된 열 정의를 사용하여 새 외부 테이블을 만듭니다. 이 기능은 Apache Parquet, Apache Avro, ORC, JSON 및 CSV 파일을 지원합니다. CSV 및 JSON 파일을 위한 지원이 현재 미리 보기로 제공됩니다.
CREATE [ OR REPLACE ] EXTERNAL TABLE <table_name> [ COPY GRANTS ] USING TEMPLATE <query> [ ... ]
참고
이 문이 같은 이름의 기존 테이블을 대체하는 경우에는 대체되는 테이블에서 권한 부여가 복사됩니다. 그 이름의 기존 테이블이 없으면 복제되는 원본 테이블에서 권한 부여가 복사됩니다.
COPY GRANTS에 대한 자세한 내용은 이 문서에 있는 COPY GRANTS 섹션을 참조하십시오.
필수 매개 변수¶
table_name
테이블의 식별자(즉, 이름)를 지정하는 문자열로, 테이블이 생성되는 스키마에 대해 고유해야 합니다.
또한, 식별자는 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예:
"My object"
)로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.
[ WITH ] LOCATION =
읽을 데이터가 포함된 파일이 스테이징되는 외부 스테이지와 옵션 경로를 지정합니다.
@[namespace.]ext_stage_name[/path]
파일이 지정된 명명된 외부 스테이지에 있습니다.
문자열 리터럴도, SQL 변수도 지원되지 않습니다.
여기서
namespace
는database_name.schema_name
또는schema_name
형식의 외부 스테이지가 있는 데이터베이스 및/또는 스키마입니다. 데이터베이스와 스키마가 현재 사용자 세션 내에서 사용 중인 경우 이는 선택 사항 입니다. 사용 중이지 않으면 필수 사항입니다.path
는 로딩할 파일 세트를 제한하는 클라우드 저장소 위치에 있는 파일의 선택적 경로로, 대/소문자를 구분합니다(즉, 파일 이름이 공통 문자열로 시작함). 다른 클라우드 저장소 서비스에서는 경로를 접두사 또는 폴더 라고도 합니다.외부 테이블은 스테이지 정의에 지정된 모든 경로에 이 경로를 추가합니다. 정의를 보려면
DESC STAGE stage_name
을 실행하고url
속성 값을 확인하십시오. 예를 들어 URL에 경로a
가 포함되고 외부 테이블 위치에 경로b
가 포함되는 경우에는 외부 테이블이stage/a/b
에서 스테이징된 파일을 읽습니다.[ WITH ] LOCATION
값은 특정 파일 이름을 참조할 수 없습니다. 외부 테이블이 스테이징된 개별 파일을 가리키도록 하려면PATTERN
매개 변수를 사용하십시오.
FILE_FORMAT = ( FORMAT_NAME = 'file_format_name' )
또는 .FILE_FORMAT = ( TYPE = CSV | JSON | AVRO | ORC | PARQUET [ ... ] )
다음 파일 형식을 지정하는 문자열(상수)입니다.
FORMAT_NAME = file_format_name
스캔할 스테이지 상태 데이터 파일을 설명하는 기존의 명명된 파일 형식을 지정합니다. 명명된 파일 형식에 따라 데이터 파일의 형식 유형(CSV, JSON 등)뿐 아니라, 기타 형식 옵션도 모두 결정됩니다.
TYPE = CSV | JSON | AVRO | ORC | PARQUET [ ... ]
외부 테이블을 쿼리할 때 스캔할 스테이지 상태 데이터 파일의 형식 유형을 지정합니다.
파일 형식 유형을 지정하면 형식별 옵션을 추가로 지정할 수 있습니다. 자세한 내용은 이 항목에 있는 형식 유형 옵션 섹션을 참조하십시오.
파일 형식 옵션은 외부 테이블 또는 스테이지 수준에서 구성할 수 있습니다. 외부 테이블 수준에서 지정된 설정이 우선 적용됩니다. 어느 수준에서도 지정되지 않은 설정은 전부 기본값을 갖는 것으로 봅니다.
기본값:
TYPE = CSV
.중요
외부 테이블은 스테이지 정의에 있는 파일 형식(있는 경우)을 상속하지 않습니다. FILE_FORMAT 매개 변수를 사용하여 외부 테이블의 파일 형식 옵션을 명시적으로 지정해야 합니다.
참고
FORMAT_NAME
과TYPE
은 상호 배타적인데, 의도하지 않은 동작을 방지하려면 외부 테이블을 만들 때 둘 중 하나만 지정해야 합니다.
선택적 매개 변수¶
col_name
열 식별자(예: 이름)를 지정하는 문자열입니다. 테이블 식별자에 대한 모든 요구 사항은 열 식별자에도 적용됩니다.
자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.
col_type
열의 데이터 타입을 지정하는 문자열(상수)입니다. 데이터 타입은 열에 대한
expr
의 결과와 일치해야 합니다.테이블 열에 지정할 수 있는 데이터 타입에 대한 자세한 내용은 SQL 데이터 타입 참조 을 참조하십시오.
expr
열에 대한 식을 지정하는 문자열입니다. 쿼리할 때 이 열은 이 식에서 파생된 결과를 반환합니다.
외부 테이블 열은 명시적 식을 사용하여 정의되는 가상 열입니다. VALUE 열 및/또는 METADATA$FILENAME 의사 열을 사용하여 가상 열을 식으로 추가합니다.
- VALUE:
외부 파일의 단일 행을 나타내는 VARIANT 타입의 열입니다.
- CSV:
VALUE 열은 각 행을 열 위치(즉,
{c1: <column_1_value>, c2: <column_2_value>, c3: <column_1_value> ...}
)를 기준으로 식별된 요소를 가진 오브젝트로 구조화합니다.예를 들어 스테이징 상태 CSV 파일의 첫 번째 열을 참조하는
mycol
로 명명된 VARCHAR 열을 추가합니다.mycol varchar as (value:c1::varchar)
- 반정형 데이터:
요소 이름과 값을 큰따옴표로 묶습니다. 점 표기법을 사용하여 VALUE 열에서 경로를 트래버스합니다.
예를 들어 다음 행이 스테이징 상태 파일에서 반정형 데이터의 단일 행을 나타낸다고 가정해보십시오.
{ "a":"1", "b": { "c":"2", "d":"3" } }
스테이징 상태 파일에서 중첩된 반복
c
요소를 참조하는mycol
로 명명된 VARCHAR 열을 추가합니다.mycol varchar as (value:"b"."c"::varchar)
- METADATA$FILENAME:
스테이지의 경로를 포함하여, 외부 테이블에 포함된 각 스테이징된 데이터 파일의 이름을 식별하는 의사 열입니다. 예는 (이 항목의) 파티션 열 식에서 자동으로 추가된 파티션 을 참조하십시오.
CONSTRAINT ...
테이블에서 지정한 열에 대한 인라인 또는 아웃오브 라인 제약 조건을 정의하는 문자열입니다.
구문 세부 정보는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오. 제약 조건에 대한 자세한 내용은 제약 조건 을 참조하십시오.
REFRESH_ON_CREATE = TRUE | FALSE
외부 테이블이 생성된 직후 외부 테이블 메타데이터를 한 번 자동으로 새로 고칠지 여부를 지정합니다. 외부 테이블 메타데이터를 새로 고치면 지정된 스테이지 경로의 현재 데이터 파일 목록과 메타데이터가 동기화됩니다. 이 작업은 메타데이터가
[ WITH ] LOCATION =
설정에 지정된 명명된 외부 스테이지에 기존 데이터 파일을 등록하는 데 필요합니다.TRUE
Snowflake는 생성 후 외부 테이블 메타데이터를 한 번 자동으로 새로 고칩니다.
참고
지정된 위치에 100만 개에 가깝거나 그 이상의 파일이 있는 경우
REFRESH_ON_CREATE = FALSE
를 설정하는 것이 좋습니다. 외부 테이블을 만든 후, 메타데이터에 그 위치의 모든 파일이 포함될 때까지 그 위치의 하위 경로(즉, 새로 고침에 포함할 파일의 하위 세트)를 지정하는 ALTER EXTERNAL TABLE … REFRESH 문을 실행하여 메타데이터를 점진적으로 새로 고칩니다.FALSE
Snowflake는 외부 테이블 메타데이터를 자동으로 새로 고치지 않습니다. 스테이지에 기존 데이터 파일을 등록하려면 ALTER EXTERNAL TABLE … REFRESH를 사용하여 외부 테이블 메타데이터를 수동으로 한 번 새로 고쳐야 합니다.
기본값:
TRUE
AUTO_REFRESH = TRUE | FALSE
[ WITH ] LOCATION =
설정에 지정된 명명된 외부 스테이지에서 신규 또는 업데이트된 데이터 파일을 사용할 수 있을 때 Snowflake가 외부 테이블 메타데이터의 자동 새로 고침 트리거를 활성화해야 할지 여부를 지정합니다.참고
이 매개 변수를 TRUE로 설정하는 것은 파티션이 오브젝트 소유자에 의해 수동으로 추가된 경우(즉,
PARTITION_TYPE = USER_SPECIFIED
인 경우) 분할된 외부 테이블에서 지원되지 않습니다.S3 호환 외부 스테이지 에 저장된 데이터 파일을 참조하는 외부 테이블에 대해 이 매개 변수를 TRUE로 설정할 수 없습니다. ALTER EXTERNAL TABLE … REFRESH 명령을 실행하여 메타데이터를 수동으로 새로 고쳐야 합니다.
새 데이터 또는 업데이트된 데이터를 외부 테이블 메타데이터로 읽을 수 있는 경우 Snowflake에 알리도록 저장소 위치에 대한 이벤트 알림을 구성해야 합니다. 자세한 내용은 클라우드 저장소 서비스의 지침을 참조하십시오.
- Amazon S3:
- Google Cloud Storage:
- Microsoft Azure:
외부 테이블이 생성되면
REFRESH_ON_CREATE = FALSE
가 아닌 경우 해당 메타데이터를 자동으로 한 번 새로 고칩니다.
TRUE
Snowflake를 사용하면 외부 테이블 메타데이터의 자동 새로 고침을 트리거할 수 있습니다.
FALSE
Snowflake를 사용하여 외부 테이블 메타데이터의 자동 새로 고침을 트리거할 수 없습니다. 메타데이터를 스테이지 경로의 현재 파일 목록과 동기화하려면 ALTER EXTERNAL TABLE … REFRESH를 사용하여 외부 테이블 메타데이터를 주기적으로 수동으로 새로 고쳐야 합니다.
기본값:
TRUE
PATTERN = 'regex_pattern'
작은따옴표로 묶인 정규식 패턴 문자열로, 외부 스테이지에서 일치시킬 파일 이름 및/또는 경로를 지정합니다.
팁
최상의 성능을 위해서는 많은 수의 파일을 필터링하는 패턴을 적용하지 마십시오.
AWS_SNS_TOPIC = 'string'
Amazon SNS(Simple Notification Service)를 사용하여 Amazon S3 스테이지를 위한 AUTO_REFRESH를 구성할 때만 필요합니다. S3 버킷에 대한 SNS 항목의 ARN(Amazon Resource Name)을 지정합니다. CREATE EXTERNAL TABLE 문은 지정된 SNS 항목에 대한 Amazon SQS(Simple Queue Service) 큐를 구독합니다. SNS 항목을 통한 이벤트 알림은 메타데이터 새로 고침을 트리거합니다. 자세한 내용은 Amazon S3에 대해 자동으로 외부 테이블 새로 고치기 섹션을 참조하십시오.
TABLE_FORMAT = DELTA
클라우드 저장소 위치에서 Delta Lake를 참조하는 외부 테이블을 식별합니다. Amazon S3, Google Cloud Storage 또는 Microsoft Azure 클라우드 저장소의 Delta Lake가 지원됩니다.
참고
이 미리 보기 기능 은 모든 계정에서 사용할 수 있습니다.
이 매개 변수가 설정되면 외부 테이블은
[ WITH ] LOCATION
위치에서 Delta Lake 트랜잭션 로그 파일을 검색합니다. 델타 로그 파일에는_delta_log/00000000000000000000.json
,_delta_log/00000000000000000010.checkpoint.parquet
등과 같은 이름이 있습니다.외부 테이블에 대한 메타데이터가 새로 고쳐지면 Snowflake는 Delta Lake 트랜잭션 로그를 구문 분석하고 어떤 Parquet 파일이 최신인지 확인합니다. 백그라운드에서 새로 고침은 파일 추가 및 제거 작업을 수행하여 외부 테이블 메타데이터를 동기화 상태로 유지합니다.
참고
[ WITH ] LOCATION =
에 지정된 외부 스테이지와 선택적 경로에는 단일 Delta Lake 테이블에 대한 데이터 파일과 메타데이터만 포함되어야 합니다. 즉, 지정된 저장소 위치는__delta_log
디렉터리 하나만 포함할 수 있습니다.클라우드 저장소에서 DDL 작업에 의해 트리거되는 이벤트 알림의 순서는 보장되지 않습니다. 따라서 Delta Lake 파일을 참조하는 외부 테이블에는 자동 새로 고침 기능을 사용할 수 없습니다.
REFRESH_ON_CREATE
및AUTO_REFRESH
둘 다 FALSE로 설정해야 합니다.추가되거나 제거된 파일을 등록하려면 ALTER EXTERNAL TABLE … REFRESH 문을 주기적으로 실행하십시오.
FILE_FORMAT
값은 Parquet을 파일 타입으로 지정해야 합니다.최적의 성능을 위해 외부 테이블에 대한 파티션 열을 정의하는 것이 좋습니다.
Delta Lake를 참조할 때는 다음 매개 변수가 지원되지 않습니다.
AWS_SNS_TOPIC = 'string'
PATTERN = 'regex_pattern'
COPY GRANTS
CREATE OR REPLACE TABLE 베리언트를 사용하여 외부 테이블을 다시 만들 때 원래 테이블의 액세스 허가를 유지하도록 지정합니다. 이 매개 변수는 OWNERSHIP을 제외한 모든 권한을 기존 테이블에서 새 테이블로 복사합니다. 기본적으로, CREATE EXTERNAL TABLE 명령을 실행하는 역할은 새 외부 테이블을 소유합니다.
참고
권한 부여 복사 작업은 CREATE EXTERNAL TABLE 명령에서 원자적으로(즉, 같은 트랜잭션 내에서) 발생합니다.
COMMENT = 'string_literal'
외부 테이블에 대한 설명을 지정하는 문자열(리터럴)입니다.
기본값: 값 없음
ROW ACCESS POLICY <policy_name> ON (VALUE)
테이블에 설정할 행 액세스 정책 을 지정합니다.
행 액세스 정책을 외부 테이블에 적용할 때 VALUE 열을 지정합니다.
TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
태그 이름과 태그 문자열 값을 지정합니다.
태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256자입니다.
문에서 태그를 지정하는 방법에 대한 자세한 내용은 오브젝트 및 열에 대한 태그 할당량 섹션을 참조하십시오.
분할 매개 변수¶
이러한 매개 변수를 사용하여 외부 테이블을 분할합니다.
part_col_name col_type AS part_expr
외부 테이블에서 하나 이상의 파티션 열을 정의합니다.
파티션 열 정의의 형식은 파티션이 각 파티션 열의 식에서 자동으로 계산되어 추가되는지 아니면 파티션이 수동으로 추가되는지에 따라 다릅니다.
- 식에서 추가됨:
파티션 열은 METADATA$FILENAME 의사 열의 경로 및/또는 파일 이름 정보를 구문 분석하는 식으로 계산해야 합니다. 파티션 열은 스캔할 필요가 없는 데이터 파일을 정리(즉, 외부 테이블 분할)하여 쿼리 성능을 최적화합니다. 파티션은 파티션 열에 대한 식의 경로 및/또는 파일 이름과 일치하는 모든 데이터 파일로 구성됩니다.
part_col_name
파티션 열 식별자(즉, 이름)를 지정하는 문자열입니다. 테이블 식별자에 대한 모든 요구 사항은 열 식별자에도 적용됩니다.
col_type
열의 데이터 타입을 지정하는 문자열(상수)입니다. 데이터 타입은 열에 대한
part_expr
의 결과와 일치해야 합니다.part_expr
열에 대한 식을 지정하는 문자열입니다. 식은 METADATA$FILENAME 의사 열을 포함해야 합니다.
외부 테이블은 현재 파티션 식에서 다음과 같은 함수 서브세트를 지원합니다.
지원되는 함수 목록:
=
,<>
,>
,>=
,<
,<=
||
+
,-
-
(부정)*
AND
,OR
NOT
- 수동으로 추가됨:
필수: 또한
PARTITION_TYPE
매개 변수 값을USER_SPECIFIED
로 설정합니다.파티션 열 정의는 내부(숨겨진) METADATA$EXTERNAL_TABLE_PARTITION 열의 열 메타데이터를 구문 분석하는 식입니다. 기본적으로 정의는 열의 데이터 타입만 정의합니다. 파티션 열 정의의 형식은 다음과 같습니다.
part_col_name col_type AS ( PARSE_JSON (METADATA$EXTERNALTABLE_PARTITION):part_col_name::data_type )
예를 들어
col1
,col2
,col3
열에 각각 varchar, 숫자, 타임스탬프(타임존) 데이터가 포함되어 있다고 가정합니다.col1 varchar as (parse_json(metadata$external_table_partition):col1::varchar), col2 number as (parse_json(metadata$external_table_partition):col2::number), col3 timestamp_tz as (parse_json(metadata$external_table_partition):col3::timestamp_tz)
테이블의 파티션 열을 정의한 후 PARTITION BY 절을 사용하여 이러한 열을 식별합니다.
참고
사용자 지정 파티션 열 이름의 최대 길이는 32자입니다.
PARTITION_TYPE = USER_SPECIFIED
외부 테이블의 파티션 유형을 사용자 정의 로 정의합니다. 외부 테이블의 소유자(즉, 외부 테이블에 대한 OWNERSHIP 권한이 있는 역할)는 ALTER EXTERNAL TABLE … ADD PARTITION 문을 실행하여 수동으로 외부 메타데이터에 파티션을 추가해야 합니다.
파티션 열의 식 평가 시 파티션이 외부 테이블 메타데이터에 자동으로 추가되는 경우 이 매개 변수를 설정하지 마십시오.
[ PARTITION BY ( part_col_name [, part_col_name ... ] ) ]
외부 테이블에 대해 평가할 파티션 열을 지정합니다.
- 사용법:
외부 테이블을 쿼리할 때 WHERE 절에 하나 이상의 파티션 열을 포함하며, 예를 들면 다음과 같습니다.
... WHERE part_col_name = 'filter_value'
Snowflake는 파티션 열을 기준으로 필터링하여 스캔할 데이터 파일 세트를 제한합니다. 이들 파일의 모든 행이 스캔됩니다. WHERE 절에 파티션이 아닌 열이 포함된 경우 해당 필터는 데이터 파일이 필터링된 후에 평가됩니다.
일반적인 방법은 시간 증분을 기준으로 데이터 파일을 분할하거나, 여러 원본에서 데이터 파일을 스테이징한 경우 데이터 원본 식별자와 날짜 또는 타임스탬프별로 분할하는 것입니다.
클라우드 공급자 매개 변수(cloudProviderParams
)¶
Google Cloud Storage
INTEGRATION = integration_name
Google Pub/Sub 이벤트 알림을 사용하여 외부 테이블 메타데이터를 자동으로 새로 고치는 데 사용되는 알림 통합의 이름을 지정합니다. 알림 통합은 Snowflake와 서드 파티 클라우드 메시지 큐 서비스 간의 인터페이스를 제공하는 Snowflake 오브젝트입니다.
이 매개 변수는 외부 테이블에 대한 자동 새로 고침 작업을 사용하는 데 필요합니다. 자동 새로 고침 기능 구성에 대한 지침은 Google Cloud Storage에 대해 자동으로 외부 테이블 새로 고치기 를 참조하십시오.
Microsoft Azure
INTEGRATION = integration_name
Azure Event Grid 알림을 사용하여 외부 테이블 메타데이터를 자동으로 새로 고치는 데 사용되는 알림 통합의 이름을 지정합니다. 알림 통합은 Snowflake와 서드 파티 클라우드 메시지 큐 서비스 간의 인터페이스를 제공하는 Snowflake 오브젝트입니다.
이 매개 변수는 외부 테이블에 대한 자동 새로 고침 작업을 사용하는 데 필요합니다. 자동 새로 고침 기능 구성에 대한 지침은 Azure Blob 저장소에 대해 자동으로 외부 테이블 새로 고치기 를 참조하십시오.
형식 유형 옵션(formatTypeOptions
)¶
형식 유형 옵션은 테이블에 데이터 로딩 및 테이블에서 데이터 언로딩 에 사용됩니다.
지정된 파일 형식 유형(FILE_FORMAT = ( TYPE = ... )
)에 따라 다음 형식별 옵션(공백, 쉼표 또는 줄 바꿈으로 구분) 중 하나 이상을 포함할 수 있습니다.
TYPE = CSV¶
COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
쿼리할 데이터 파일에 대한 현재 압축 알고리즘을 지정하는 문자열(상수)입니다. Snowflake는 이 옵션을 사용하여 이미 압축된 데이터 파일을 압축한 방식을 감지해 쿼리를 위해 파일의 압축 데이터를 추출할 수 있습니다.
지원되는 값
참고
AUTO
현재 자동으로 감지할 수 없는 Brotli 압축 파일을 제외하고 압축 알고리즘이 자동으로 감지됩니다. Brotli 압축 파일을 쿼리하는 경우
AUTO
대신BROTLI
를 명시적으로 사용합니다.GZIP
BZ2
BROTLI
Brotli 압축 파일을 쿼리할 때 지정해야 합니다.
ZSTD
Zstandard v0.8 이상이 지원됩니다.
DEFLATE
Deflate 압축 파일(zlib 헤더 RFC1950 포함).
RAW_DEFLATE
원시 Deflate 압축 파일(헤더 RFC1951 제외).
NONE
데이터 파일이 압축되지 않았습니다.
RECORD_DELIMITER = 'character' | NONE
입력 파일에서 레코드를 구분하는 하나 이상의 문자입니다. 일반적인 이스케이프 시퀀스 또는 다음 싱글바이트 또는 멀티바이트 문자를 허용합니다.
- 싱글바이트 문자:
8진수 값(
\\
접두사가 붙음) 또는 16진수 값(0x
또는\x
접두사가 붙음). 예를 들어, 곡절 악센트(^
) 문자로 구분된 레코드의 경우 8진수(\\136
) 또는 16진수(0x5e
) 값을 지정합니다.- 멀티바이트 문자:
16진수 값(
\x
접두사가 붙음). 예를 들어, 센트(¢
) 문자로 구분된 레코드의 경우 16진수(\xC2\xA2
) 값을 지정합니다.RECORD_DELIMITER 또는 FIELD_DELIMITER의 구분 기호는 다른 파일 형식 옵션(예:
FIELD_DELIMITER = 'aa' RECORD_DELIMITER = 'aabb'
)에 대한 구분 기호의 하위 문자열일 수 없습니다.
지정된 구분 기호는 임의의 바이트 시퀀스가 아니라 유효한 UTF-8 문자여야 합니다. 또한, 구분 기호는 최대 20자로 제한됩니다.
NONE
의 값도 허용합니다.기본값: 줄 바꿈 문자. “줄 바꿈”은
\r\n
이 Windows 플랫폼에서 파일에 대한 줄 바꿈으로 이해되게끔 하는 논리입니다.FIELD_DELIMITER = 'character' | NONE
입력 파일에서 필드를 구분하는 하나 이상의 싱글바이트 또는 멀티바이트 문자입니다. 일반적인 이스케이프 시퀀스 또는 다음 싱글바이트 또는 멀티바이트 문자를 허용합니다.
- 싱글바이트 문자:
8진수 값(
\\
접두사가 붙음) 또는 16진수 값(0x
또는\x
접두사가 붙음). 예를 들어, 곡절 악센트(^
) 문자로 구분된 레코드의 경우 8진수(\\136
) 또는 16진수(0x5e
) 값을 지정합니다.- 멀티바이트 문자:
16진수 값(
\x
접두사가 붙음). 예를 들어, 센트(¢
) 문자로 구분된 레코드의 경우 16진수(\xC2\xA2
) 값을 지정합니다.RECORD_DELIMITER 또는 FIELD_DELIMITER의 구분 기호는 다른 파일 형식 옵션(예:
FIELD_DELIMITER = 'aa' RECORD_DELIMITER = 'aabb'
)에 대한 구분 기호의 하위 문자열일 수 없습니다.참고
비 ASCII 문자의 경우 결정적 동작을 얻으려면 16진수 바이트 시퀀스 값을 사용해야 합니다.
지정된 구분 기호는 임의의 바이트 시퀀스가 아니라 유효한 UTF-8 문자여야 합니다. 또한, 구분 기호는 최대 20자로 제한됩니다.
NONE
의 값도 허용합니다.기본값: 쉼표(
,
)SKIP_HEADER = integer
파일 시작에서 건너뛸 줄의 개수입니다.
참고로, SKIP_HEADER는 헤더 줄이 무엇인지 결정하기 위해 RECORD_DELIMITER 또는 FIELD_DELIMITER 값을 사용하지는 않으며, 오히려 파일에서 지정된 수만큼 CRLF(캐리지 리턴, 줄 바꿈)로 구분된 줄을 건너뜁니다. 그런 다음 RECORD_DELIMITER와 FIELD_DELIMITER를 사용해 쿼리할 데이터 행을 결정합니다.
기본값:
0
SKIP_BLANK_LINES = TRUE | FALSE
- 용도:
데이터 쿼리 전용
- 정의:
데이터 파일에서 발견되는 빈 줄을 건너뛰도록 지정하는 부울입니다. 그렇지 않으면 빈 줄로 인해 레코드 끝 오류를 발생합니다(기본 동작).
기본값:
FALSE
ESCAPE_UNENCLOSED_FIELD = 'character' | NONE
괄호로 묶이지 않은 필드 값에 대해서만 이스케이프 문자로 사용되는 싱글바이트 문자열입니다. 이스케이프 문자는 문자 시퀀스의 후속 문자에 대한 대체 해석을 호출합니다. ESCAPE 문자를 사용하여 데이터에 있는
FIELD_DELIMITER
또는RECORD_DELIMITER
문자의 인스턴스를 리터럴로 해석할 수 있습니다. 이스케이프 문자는 데이터에서 자신의 인스턴스를 이스케이프하는 데 사용할 수도 있습니다.일반적인 이스케이프 시퀀스, 8진수 값 또는 16진수 값을 허용합니다.
괄호로 묶이지 않은 필드에만 이스케이프 문자를 지정합니다.
참고
기본값은
\\
입니다. 데이터 파일의 행이 백슬래시(\
) 문자로 끝날 경우 이 문자는RECORD_DELIMITER
파일 형식 옵션에 대해 지정된 줄 바꿈 또는 캐리지 리턴 문자를 이스케이프합니다. 결과적으로, 이 행과 다음 행이 단일 데이터 행으로 처리됩니다. 이 문제를 방지하려면 값을NONE
으로 설정하십시오.이 파일 형식 옵션은 싱글바이트 문자만 지원합니다. UTF-8 문자 인코딩은 상위 ASCII 문자를 멀티바이트 문자로 나타냅니다. 데이터 파일이 UTF-8 문자 세트로 인코딩된 경우 상위 ASCII 문자를 옵션 값으로 지정할 수 없습니다.
또한 상위 ASCII 문자를 지정하는 경우
ENCODING = 'string'
파일 형식 옵션을 데이터 파일의 문자 인코딩으로 설정하여 문자가 올바르게 해석되도록 보장하는 것이 좋습니다.
기본값: 백슬래시(
\\
)TRIM_SPACE = TRUE | FALSE
필드에서 공백을 제거할지 여부를 지정하는 부울입니다.
예를 들어, 외부 데이터베이스 소프트웨어에서 필드를 따옴표로 묶지만 선행 공백을 삽입하는 경우 Snowflake는 여는 따옴표 문자가 아닌 선행 공백을 필드의 시작으로 읽습니다(즉, 따옴표는 필드 데이터 문자열의 일부로 해석됨). 데이터를 쿼리할 때 불필요한 공백을 제거하려면 이 옵션을
TRUE
로 설정하십시오.또 다른 예로, 선행 또는 후행 공백이 문자열을 묶는 따옴표 주위에 있는 경우 이 옵션을 사용하여 주위의 공백을 제거하고
FIELD_OPTIONALLY_ENCLOSED_BY
옵션을 사용하여 따옴표를 제거할 수 있습니다. 따옴표 안의 모든 공백은 그대로 유지됩니다. 예를 들어FIELD_DELIMITER = '|'
및FIELD_OPTIONALLY_ENCLOSED_BY = '"'
를 가정하면 다음과 같습니다.|"Hello world"| /* returned as */ >Hello world< |" Hello world "| /* returned as */ > Hello world < | "Hello world" | /* returned as */ >Hello world<
이 예에서 대괄호는 반환되지 않습니다. 대괄호는 반환된 문자열의 시작과 끝의 경계를 정하는 데 사용됩니다.
기본값:
FALSE
FIELD_OPTIONALLY_ENCLOSED_BY = 'character' | NONE
문자열을 묶는 데 사용되는 문자입니다. 값은
NONE
, 작은따옴표 문자('
) 또는 큰따옴표 문자("
)일 수 있습니다. 작은따옴표 문자를 사용하려면 8진수 또는 16진수 표현(0x27
) 또는 이중 작은따옴표로 묶인 이스케이프(''
)를 사용하십시오.필드에 이 문자가 포함된 경우 같은 문자를 사용하여 이스케이프합니다. 예를 들어 값이 큰따옴표 문자이고 필드에 문자열
A "B" C
가 포함된 경우 다음과 같이 큰따옴표를 이스케이프합니다.A ""B"" C
기본값:
NONE
NULL_IF = ( 'string1' [ , 'string2' , ... ] )
SQL NULL로 변환하거나 그 반대로 변환하는 데 사용되는 문자열:
데이터를 쿼리할 때 Snowflake는 반환된 데이터에서 이러한 값을 SQL NULL로 바꿉니다. 둘 이상의 문자열을 지정하려면 문자열 목록을 괄호로 묶고 쉼표를 사용하여 각각의 값을 구분합니다.
Snowflake는 데이터 타입과 관계없이 값의 모든 인스턴스를 NULL로 변환합니다. 예를 들어
2
가 값으로 지정되면2
의 모든 인스턴스가 문자열 또는 숫자로 변환됩니다.예:
NULL_IF = ('\N', 'NULL', 'NUL', '')
이 옵션에는 빈 문자열이 포함될 수 있습니다.
기본값:
\\N
(즉,ESCAPE_UNENCLOSED_FIELD
값이\\
인 것으로 가정하는 NULL)EMPTY_FIELD_AS_NULL = TRUE | FALSE
두 개의 연속적인 구분 기호(예:
,,
)로 표시되는 입력 파일의 빈 필드에 대해 SQL NULL을 반환할지 여부를 지정합니다.FALSE
로 설정하면 Snowflake가 빈 필드를 해당 열 타입으로 캐스팅하려고 시도합니다. STRING 유형의 열에 대해 빈 문자열이 반환됩니다. 다른 열 유형의 경우 이 쿼리는 오류를 반환합니다.기본값:
TRUE
ENCODING = 'string'
데이터를 쿼리할 때 원본 데이터의 문자 세트를 지정하는 문자열(상수)입니다.
문자 세트
ENCODING
값지원되는 언어
참고
Big5
BIG5
중국어 번체
EUC-JP
EUCJP
일본어
EUC-KR
EUCKR
한국어
GB18030
GB18030
중국어
IBM420
IBM420
아랍어
IBM424
IBM424
히브리어
IBM949
IBM949
한국어
ISO-2022-CN
ISO2022CN
중국어 간체
ISO-2022-JP
ISO2022JP
일본어
ISO-2022-KR
ISO2022KR
한국어
ISO-8859-1
ISO88591
덴마크어, 네덜란드어, 영어, 프랑스어, 독일어, 이탈리아어, 노르웨이어, 포르투갈어, 스웨덴어
ISO-8859-2
ISO88592
체코어, 헝가리어, 폴란드어, 루마니아어
ISO-8859-5
ISO88595
러시아어
ISO-8859-6
ISO88596
아랍어
ISO-8859-7
ISO88597
그리스어
ISO-8859-8
ISO88598
히브리어
ISO-8859-9
ISO88599
터키어
ISO-8859-15
ISO885915
덴마크어, 네덜란드어, 영어, 프랑스어, 독일어, 이탈리아어, 노르웨이어, 포르투갈어, 스웨덴어
유로화 기호를 포함하여, 8자를 제외하면 ISO-8859-1과 동일합니다.
KOI8-R
KOI8R
러시아어
Shift_JIS
SHIFTJIS
일본어
UTF-8
UTF8
모든 언어
구분된 파일(CSV, TSV 등)에서 데이터를 로딩하는 경우 UTF-8이 기본값입니다. . . 지원되는 다른 모든 파일 형식(JSON, Avro 등)에서 데이터를 로딩할 뿐 아니라 언로딩하는 경우 UTF-8이 유일하게 지원되는 문자 세트입니다.
UTF-16
UTF16
모든 언어
UTF-16BE
UTF16BE
모든 언어
UTF-16LE
UTF16LE
모든 언어
UTF-32
UTF32
모든 언어
UTF-32BE
UTF32BE
모든 언어
UTF-32LE
UTF32LE
모든 언어
windows-949
WINDOWS949
한국어
windows-1250
WINDOWS1250
체코어, 헝가리어, 폴란드어, 루마니아어
windows-1251
WINDOWS1251
러시아어
windows-1252
WINDOWS1252
덴마크어, 네덜란드어, 영어, 프랑스어, 독일어, 이탈리아어, 노르웨이어, 포르투갈어, 스웨덴어
windows-1253
WINDOWS1253
그리스어
windows-1254
WINDOWS1254
터키어
windows-1255
WINDOWS1255
히브리어
windows-1256
WINDOWS1256
아랍어
기본값:
UTF8
참고
Snowflake는 모든 데이터를 UTF-8 문자 세트에 내부적으로 저장합니다. 데이터는 UTF-8로 변환됩니다.
TYPE = JSON¶
COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
반환할 데이터 파일에 대한 현재 압축 알고리즘을 지정하는 문자열(상수)입니다. Snowflake는 이 옵션을 사용하여 이미 압축된 데이터 파일을 압축한 방식을 감지해 쿼리를 위해 파일의 압축 데이터를 추출할 수 있습니다.
지원되는 값
참고
AUTO
현재 자동으로 감지할 수 없는 Brotli 압축 파일을 제외하고 압축 알고리즘이 자동으로 감지됩니다. Brotli 압축 파일을 쿼리하는 경우
AUTO
대신BROTLI
를 명시적으로 사용합니다.GZIP
BZ2
BROTLI
ZSTD
DEFLATE
Deflate 압축 파일(zlib 헤더 RFC1950 포함).
RAW_DEFLATE
원시 Deflate 압축 파일(헤더 RFC1951 제외).
NONE
파일이 압축되지 않았음을 나타냅니다.
기본값:
AUTO
ALLOW_DUPLICATE = TRUE | FALSE
중복 오브젝트 필드 이름을 허용하도록 지정하는 부울입니다(마지막 이름만 보존됨).
기본값:
FALSE
STRIP_OUTER_ARRAY = TRUE | FALSE
JSON 파서에 바깥쪽 대괄호(즉,
[ ]
)를 제거하도록 지시하는 부울입니다.기본값:
FALSE
STRIP_NULL_VALUES = TRUE | FALSE
JSON 파서에
null
값이 포함된 오브젝트 필드 또는 배열 요소를 제거하도록 지시하는 부울입니다. 예를 들어TRUE
로 설정할 경우 다음과 같습니다.이전
이후
[null]
[]
[null,null,3]
[,,3]
{"a":null,"b":null,"c":123}
{"c":123}
{"a":[1,null,2],"b":{"x":null,"y":88}}
{"a":[1,,2],"b":{"y":88}}
기본값:
FALSE
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
유효하지 않은 UTF-8 문자를 유니코드 대체 문자(
�
)로 대체할지 여부를 지정하는 부울. 이 옵션은 일대일 문자 대체를 수행합니다.TRUE
로 설정하면 Snowflake가 잘못된 UTF-8 문자를 유니코드 대체 문자로 바꿉니다.FALSE
로 설정하면 잘못된 UTF-8 문자 인코딩이 감지될 때 로딩 작업에서 오류가 발생합니다.기본값:
FALSE
TYPE = AVRO¶
COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
쿼리할 데이터 파일에 대한 현재 압축 알고리즘을 지정하는 문자열(상수)입니다. Snowflake는 이 옵션을 사용하여 이미 압축된 데이터 파일을 압축한 방식을 감지해 쿼리를 위해 파일의 압축 데이터를 추출할 수 있습니다.
지원되는 값
참고
AUTO
현재 자동으로 감지할 수 없는 Brotli 압축 파일을 제외하고 압축 알고리즘이 자동으로 감지됩니다. Brotli 압축 파일을 쿼리하는 경우
AUTO
대신BROTLI
를 명시적으로 사용합니다.GZIP
BZ2
BROTLI
ZSTD
DEFLATE
Deflate 압축 파일(zlib 헤더 RFC1950 포함).
RAW_DEFLATE
원시 Deflate 압축 파일(헤더 RFC1951 제외).
NONE
쿼리할 데이터 파일이 압축되지 않았습니다.
기본값:
AUTO
.
참고
기본 AUTO
옵션으로 파일 및 코덱 압축이 모두 결정되므로 기본 옵션을 사용하는 것이 좋습니다. 압축 옵션 지정은 블록(코덱) 압축이 아닌 파일 압축을 가리킵니다.
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
유효하지 않은 UTF-8 문자를 유니코드 대체 문자(
�
)로 대체할지 여부를 지정하는 부울. 이 옵션은 일대일 문자 대체를 수행합니다.TRUE
로 설정하면 Snowflake가 잘못된 UTF-8 문자를 유니코드 대체 문자로 바꿉니다.FALSE
로 설정하면 잘못된 UTF-8 문자 인코딩이 감지될 때 로딩 작업에서 오류가 발생합니다.기본값:
FALSE
TYPE = ORC¶
TRIM_SPACE = TRUE | FALSE
문자열에서 선행 공백과 후행 공백을 제거할지 여부를 지정하는 부울입니다.
예를 들어, 외부 데이터베이스 소프트웨어에서 필드를 따옴표로 묶지만 선행 공백을 삽입하는 경우 Snowflake는 여는 따옴표 문자가 아닌 선행 공백을 필드의 시작으로 읽습니다(즉, 따옴표는 필드 데이터 문자열의 일부로 해석됨). 불필요한 공백을 제거하려면 이 옵션을
TRUE
로 설정하십시오.이 파일 형식 옵션은 다음 작업에만 적용됩니다.
스테이지 상태 ORC 데이터 파일에서 오브젝트 값을 쿼리하는 작업.
MATCH_BY_COLUMN_NAME 복사 옵션을 사용하여 ORC 데이터를 별개의 열에서 쿼리하는 작업.
COPY 문에 쿼리를 지정하여 별개의 열에서 ORC 데이터를 쿼리하는 작업(즉, COPY 변환).
기본값:
FALSE
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
유효하지 않은 UTF-8 문자를 유니코드 대체 문자(
�
)로 대체할지 여부를 지정하는 부울. 이 옵션은 일대일 문자 대체를 수행합니다.TRUE
로 설정하면 Snowflake가 잘못된 UTF-8 문자를 유니코드 대체 문자로 바꿉니다.FALSE
로 설정하면 잘못된 UTF-8 문자 인코딩이 감지될 때 로딩 작업에서 오류가 발생합니다.기본값:
FALSE
NULL_IF = ( 'string1' [ , 'string2' , ... ] )
SQL NULL로 변환하거나 그 반대로 변환하는 데 사용되는 문자열입니다. Snowflake는 데이터 원본의 이러한 문자열을 SQL NULL로 바꿉니다. 둘 이상의 문자열을 지정하려면 문자열 목록을 괄호로 묶고 쉼표를 사용하여 각각의 값을 구분합니다.
Snowflake는 데이터 타입과 관계없이 값의 모든 인스턴스를 NULL로 변환합니다. 예를 들어
2
가 값으로 지정되면2
의 모든 인스턴스가 문자열 또는 숫자로 변환됩니다.예:
NULL_IF = ('\N', 'NULL', 'NUL', '')
이 옵션에는 빈 문자열이 포함될 수 있습니다.
이 파일 형식 옵션은 스테이징된 ORC 데이터 파일에서 오브젝트 값을 쿼리할 때 적용됩니다.
기본값:
\\N
(즉,ESCAPE_UNENCLOSED_FIELD
값이\\
인 것으로 가정하는 NULL)
TYPE = PARQUET¶
COMPRESSION = AUTO | SNAPPY | NONE
Parquet 파일의 열에 대한 현재 압축 알고리즘을 지정하는 문자열(상수)입니다.
지원되는 값
참고
AUTO
압축 알고리즘이 자동으로 감지됩니다. Brotli, gzip, Lempel-Ziv-Oberhumer(LZO), LZ4, Snappy 또는 Zstandard v0.8 이상의 압축 알고리즘을 지원합니다.
SNAPPY
NONE
데이터 파일이 압축되지 않았습니다.
기본값:
AUTO
BINARY_AS_TEXT = TRUE | FALSE
정의된 논리 데이터 타입이 없는 열을 UTF-8 텍스트로 해석할지 여부를 지정하는 부울입니다.
FALSE
로 설정하면 Snowflake가 이러한 열을 이진 데이터로 해석합니다.기본값:
TRUE
참고
잠재적인 변환 문제를 방지하도록 BINARY_AS_TEXT를 FALSE로 설정하는 것이 좋습니다.
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
유효하지 않은 UTF-8 문자를 유니코드 대체 문자(
�
)로 대체할지 여부를 지정하는 부울. 이 옵션은 일대일 문자 대체를 수행합니다.TRUE
로 설정하면 Snowflake가 잘못된 UTF-8 문자를 유니코드 대체 문자로 바꿉니다.FALSE
로 설정하면 잘못된 UTF-8 문자 인코딩이 감지될 때 로딩 작업에서 오류가 발생합니다.기본값:
FALSE
액세스 제어 요구 사항¶
이 SQL 명령을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.
권한 |
오브젝트 |
참고 |
---|---|---|
CREATE EXTERNAL TABLE |
스키마 |
|
CREATE STAGE |
스키마 |
새 스테이지를 만드는 경우에 필요합니다. |
USAGE |
스테이지 |
기존 스테이지를 참조하는 경우에 필요합니다. |
USAGE |
파일 형식 |
스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.
지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.
보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 액세스 제어의 개요 섹션을 참조하십시오.
사용법 노트¶
외부 테이블은 외부(즉, S3, Azure 또는 GCS) 스테이지만 지원하며, 내부(즉, Snowflake) 스테이지는 지원되지 않습니다.
사용자는 검색하기 전에 복원이 필요한 아카이브 클라우드 저장소 클래스에 있는 데이터에 액세스할 수 없습니다. 이러한 아카이브 저장소 클래스로는 예를 들어 Amazon S3 Glacier Flexible Retrieval 또는 Glacier Deep Archive 저장소 클래스 또는 Microsoft Azure Archive Storage 등이 있습니다.
Snowflake는 외부 테이블에 무결성 제약 조건을 적용하지 않습니다. 특히, Snowflake는 일반 테이블과 달리 NOT NULL 제약 조건을 강제 적용하지 않습니다.
외부 테이블은 다음 메타데이터 열을 포함합니다.
METADATA$FILENAME: 외부 테이블에 포함된 각 스테이지 상태 데이터 파일의 이름입니다. 스테이지의 데이터 파일에 대한 경로를 포함합니다.
METADATA$FILE_ROW_NUMBER: 스테이징된 데이터 파일에서 각 레코드의 행 번호.
다음은 외부 테이블에 대해 지원되지 않습니다.
클러스터링 키
복제
XML 형식의 데이터
Time Travel은 외부 테이블에 대해 지원되지 않습니다.
정책과 함께 외부 테이블을 사용하는 방법에 대한 자세한 내용은 다음을 참조하십시오.
OR REPLACE
를 사용하는 것은 기존 외부 테이블에서 DROP EXTERNAL TABLE 을 사용한 다음 같은 이름을 가진 새 외부 테이블을 만드는 것과 같습니다.CREATE OR REPLACE <오브젝트> 문은 원자성입니다. 즉, 오브젝트가 바뀔 때 단일 트랜잭션으로 이전 오브젝트가 삭제되고 새 오브젝트가 생성됩니다.
이는 CREATE OR REPLACE EXTERNAL TABLE 작업과 동시에 수행되는 모든 쿼리가 이전 또는 새 외부 테이블 버전을 사용함을 의미합니다.
메타데이터 관련:
주의
고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.
외부 테이블에 행 액세스 정책이 추가된 외부 테이블을 만들 때, POLICY_CONTEXT 함수를 사용하여, 행 액세스 정책으로 보호되는 외부 테이블에 대한 쿼리를 시뮬레이션합니다.
SELECT
*
는 항상 모든 일반 데이터 또는 반정형 데이터가 베리언트 행으로 캐스팅되는 VALUE 열을 반환합니다.
예¶
파티션 열 식에서 자동으로 추가된 파티션¶
파티션 열 정의의 식에서 계산된 파티션이 있는 외부 테이블을 만듭니다.
다음 예에서 데이터 파일은 다음 구조로 클라우드 저장소에 구성됩니다. logs/YYYY/MM/DD/HH24
. 예:
logs/2018/08/05/0524/
logs/2018/08/27/1408/
데이터 파일이 저장되는 저장소 위치에 대해
s1
로 명명된 외부 스테이지를 만듭니다. 자세한 내용은 CREATE STAGE 섹션을 참조하십시오.스테이지 정의는 다음과 같이 경로
/files/logs/
를 포함합니다.Amazon S3
CREATE STAGE s1 URL='s3://mybucket/files/logs/' ... ;
Google Cloud Storage
CREATE STAGE s1 URL='gcs://mybucket/files/logs/' ... ;
Microsoft Azure
CREATE STAGE s1 URL='azure://mycontainer/files/logs/' ... ;
스테이지 상태 데이터에서 METADATA$FILENAME 의사 열을 쿼리합니다. 그 결과를 사용하여 파티션 열을 개발합니다.
SELECT metadata$filename FROM @s1/; +----------------------------------------+ | METADATA$FILENAME | |----------------------------------------| | files/logs/2018/08/05/0524/log.parquet | | files/logs/2018/08/27/1408/log.parquet | +----------------------------------------+
분할된 외부 테이블을 만듭니다.
파티션 열
date_part
는 TO_DATE , DATE 를 사용하여 METADATA$FILENAME 의사 열에서YYYY/MM/DD
를 날짜로 캐스팅합니다. 또한 SQL 명령은 Parquet을 파일 형식 유형으로 지정합니다.Amazon S3 및 Microsoft Azure 클라우드 저장소용 외부 테이블에는 해당 클라우드 메시징 서비스의 이벤트 알림에 의해 트리거될 때 메타데이터를 자동으로 새로 고치는 데 필요한 매개 변수가 포함됩니다.
Amazon S3
CREATE EXTERNAL TABLE et1( date_part date AS TO_DATE(SPLIT_PART(metadata$filename, '/', 3) || '/' || SPLIT_PART(metadata$filename, '/', 4) || '/' || SPLIT_PART(metadata$filename, '/', 5), 'YYYY/MM/DD'), timestamp bigint AS (value:timestamp::bigint), col2 varchar AS (value:col2::varchar)) PARTITION BY (date_part) LOCATION=@s1/logs/ AUTO_REFRESH = true FILE_FORMAT = (TYPE = PARQUET) AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket';
Google Cloud Storage
CREATE EXTERNAL TABLE et1( date_part date AS TO_DATE(SPLIT_PART(metadata$filename, '/', 3) || '/' || SPLIT_PART(metadata$filename, '/', 4) || '/' || SPLIT_PART(metadata$filename, '/', 5), 'YYYY/MM/DD'), timestamp bigint AS (value:timestamp::bigint), col2 varchar AS (value:col2::varchar)) PARTITION BY (date_part) LOCATION=@s1/logs/ AUTO_REFRESH = true FILE_FORMAT = (TYPE = PARQUET);
Microsoft Azure
CREATE EXTERNAL TABLE et1( date_part date AS TO_DATE(SPLIT_PART(metadata$filename, '/', 3) || '/' || SPLIT_PART(metadata$filename, '/', 4) || '/' || SPLIT_PART(metadata$filename, '/', 5), 'YYYY/MM/DD'), timestamp bigint AS (value:timestamp::bigint), col2 varchar AS (value:col2::varchar)) PARTITION BY (date_part) INTEGRATION = 'MY_INT' LOCATION=@s1/logs/ AUTO_REFRESH = true FILE_FORMAT = (TYPE = PARQUET);
외부 테이블 메타데이터를 새로 고칩니다.
ALTER EXTERNAL TABLE et1 REFRESH;
외부 테이블을 쿼리할 때 WHERE 절을 사용하여 파티션 열별로 데이터를 필터링합니다. Snowflake는 필터 조건과 일치하는 지정된 파티션의 파일만 검색합니다.
SELECT timestamp, col2 FROM et1 WHERE date_part = to_date('08/05/2018');
수동으로 추가된 파티션¶
사용자 정의 파티션이 있는 외부 테이블을 만듭니다(즉, 파티션은 외부 테이블 소유자가 수동으로 추가함).
데이터 파일이 저장되는 저장 위치에 대해
s2
라는 외부 스테이지를 만듭니다.스테이지 정의는 다음과 같이 경로
/files/logs/
를 포함합니다.Amazon S3
CREATE STAGE s2 URL='s3://mybucket/files/logs/' ... ;
Google Cloud Storage
CREATE STAGE s2 URL='gcs://mybucket/files/logs/' ... ;
Microsoft Azure
CREATE STAGE s2 URL='azure://mycontainer/files/logs/' ... ;
분할된 외부 테이블을 만듭니다. 외부 테이블에는 데이터 타입이 다른 세 개의 파티션 열이 있습니다.
파티션 식의 열 이름은 대/소문자를 구분합니다. 다음 규칙이 적용됩니다.
파티션 열 이름은 열 이름이 큰따옴표로 묶여 있지 않을 경우 대문자여야 합니다. 또는 SQL 식에서 대/소문자를 구분하는
:
문자 대신 GET_IGNORE_CASE 를 사용하십시오.열 이름이 큰따옴표로 묶인 경우(예: “Column1”) 파티션 열 이름도 큰따옴표로 묶어야 하며 열 이름과 정확히 일치해야 합니다.
외부 테이블 메타데이터가 새로 고쳐지지 않으므로 세 가지 클라우드 저장소 서비스(Amazon S3, Google Cloud Storage, Microsoft Azure) 각각의 구문은 동일합니다.
create external table et2( col1 date as (parse_json(metadata$external_table_partition):COL1::date), col2 varchar as (parse_json(metadata$external_table_partition):COL2::varchar), col3 number as (parse_json(metadata$external_table_partition):COL3::number)) partition by (col1,col2,col3) location=@s2/logs/ partition_type = user_specified file_format = (type = parquet);
파티션 열에 대한 파티션 추가:
ALTER EXTERNAL TABLE et2 ADD PARTITION(col1='2022-01-24', col2='a', col3='12') LOCATION '2022/01';
Snowflake는 외부 테이블의 메타데이터에 파티션을 추가합니다. 이 작업은 지정된 위치에 있는 모든 새 데이터 파일도 메타데이터에 추가합니다.
+---------------------------------------+----------------+-------------------------------+ | file | status | description | +---------------------------------------+----------------+-------------------------------+ | mycontainer/files/logs/2022/01/24.csv | REGISTERED_NEW | File registered successfully. | | mycontainer/files/logs/2022/01/25.csv | REGISTERED_NEW | File registered successfully. | +---------------------------------------+----------------+-------------------------------+
외부 테이블을 쿼리할 때 WHERE 절을 사용하여 파티션 열별로 데이터를 필터링합니다. 이 예제에서는 스테이징된 데이터 파일에 저장된 순서대로 레코드를 반환합니다.
SELECT col1, col2, col3 FROM et1 WHERE col1 = TO_DATE('2022-01-24') AND col2 = 'a' ORDER BY METADATA$FILE_ROW_NUMBER;
Delta Lake의 파일을 참조하는 외부 테이블¶
mystage
외부 스테이지 및 daily
경로에서 Parquet 형식의 Delta Lake 파일을 참조하는 ext_twitter_feed
라는 분할된 외부 테이블을 만듭니다.
파티션 열 date_part
는 TO_DATE , DATE 를 사용하여 METADATA$FILENAME 유사 열의 YYYY/MM/DD
를 날짜로 캐스팅합니다.
CREATE EXTERNAL TABLE ext_twitter_feed(
date_part date AS TO_DATE(SPLIT_PART(metadata$filename, '/', 3)
|| '/' || SPLIT_PART(metadata$filename, '/', 4)
|| '/' || SPLIT_PART(metadata$filename, '/', 5), 'YYYY/MM/DD'),
timestamp bigint AS (value:timestamp::bigint),
col2 varchar AS (value:col2::varchar))
PARTITION BY (date_part)
LOCATION=@mystage/daily/
REFRESH_ON_CREATE = FALSE
AUTO_REFRESH = FALSE
FILE_FORMAT = (TYPE = PARQUET)
TABLE_FORMAT = DELTA;
외부 테이블의 구체화된 뷰¶
파티션 열 식에서 자동으로 추가된 파티션 예에서 만들어진 외부 테이블의 열 하위 쿼리를 기반으로 구체화된 뷰를 만듭니다.
CREATE MATERIALIZED VIEW et1_mv
AS
SELECT col2 FROM et1;
이 SQL 명령의 일반 구문, 사용법 노트, 추가적인 예는 CREATE MATERIALIZED VIEW 를 참조하십시오.
감지된 열 정의로 생성된 외부 테이블¶
Avro, Parquet 또는 ORC 데이터를 포함하는 스테이징된 파일 세트에서 열 정의가 파생되는 외부 테이블을 만듭니다.
문에서 참조하는 mystage
스테이지와 my_parquet_format
파일 형식이 이미 있어야 합니다. 스테이지 정의에서 참조하는 클라우드 저장소 위치에 파일 세트가 이미 스테이징되어 있어야 합니다.
이 예는 INFER_SCHEMA 항목의 예를 기반으로 합니다.
CREATE EXTERNAL TABLE mytable USING TEMPLATE ( SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*)) FROM TABLE( INFER_SCHEMA( LOCATION=>'@mystage', FILE_FORMAT=>'my_parquet_format' ) ) ) LOCATION=@mystage FILE_FORMAT=my_parquet_format AUTO_REFRESH=false;
ARRAY_AGG(OBJECT_CONSTRUCT())
에 대해 *
를 사용하면 반환된 결과가 16 MB보다 클 경우 오류가 발생할 수 있습니다. 다음 예에서 보여주는 것처럼, 더 큰 결과 세트에는 *
를 사용하지 말고 쿼리에 필수적인 열인 COLUMN NAME
, TYPE
, NULLABLE
만 사용하십시오. WITHIN GROUP (ORDER BY order_id)
를 사용할 때 선택적 열 ORDER_ID
를 포함할 수 있습니다.
CREATE EXTERNAL TABLE mytable USING TEMPLATE ( SELECT ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME',COLUMN_NAME, 'TYPE',TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION',EXPRESSION)) FROM TABLE( INFER_SCHEMA( LOCATION=>'@mystage', FILE_FORMAT=>'my_parquet_format' ) ) ) LOCATION=@mystage FILE_FORMAT=my_parquet_format AUTO_REFRESH=false;