카테고리:

테이블, 뷰 및 시퀀스 DDL

CREATE EXTERNAL TABLE

현재/지정된 스키마에 새 외부 테이블을 만들거나 기존 외부 테이블을 대체합니다. 쿼리 시, 외부 테이블은 지정된 외부 스테이지에 있는 하나 이상의 파일 세트에서 데이터를 읽어 단일 VARIANT 열에 데이터를 출력합니다.

이름, 데이터 타입 그리고 선택적으로 열에 값(NOT NULL)이 필요한지 또는 참조 무결성 제약 조건(기본 키, 외래 키 등)이 있는지 여부로 구성된 각각의 열 정의를 사용하여 추가적인 열을 정의할 수 있습니다. 자세한 내용은 사용법 노트를 참조하십시오.

참고 항목:

ALTER EXTERNAL TABLE , DROP EXTERNAL TABLE , SHOW EXTERNAL TABLES , DESCRIBE EXTERNAL TABLE

이 항목의 내용:

구문

-- 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 ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON (VALUE) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ COMMENT = '<string_literal>' ]

-- 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 ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON (VALUE) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ COMMENT = '<string_literal>' ]

-- 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 ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON (VALUE) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ COMMENT = '<string_literal>' ]

여기서:

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
-- If FILE_FORMAT = ( TYPE = AVRO ... )
     COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
-- If FILE_FORMAT = ( TYPE = ORC ... )
     TRIM_SPACE = TRUE | FALSE
     NULL_IF = ( '<string>' [ , '<string>' ... ]
-- If FILE_FORMAT = ( TYPE = PARQUET ... )
     COMPRESSION = AUTO | SNAPPY | NONE
     BINARY_AS_TEXT = TRUE | FALSE

베리언트 구문

CREATE EXTERNAL TABLE … USING TEMPLATE

반정형 데이터를 포함하는 스테이징된 파일 세트에서 파생된 열 정의를 사용하여 새 외부 테이블을 만듭니다. 이 기능은 현재 Apache Parquet, Apache Avro 및 ORC 파일로 제한됩니다.

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 변수도 지원되지 않습니다.

여기서:

  • namespacedatabase_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_NAMETYPE 은 상호 배타적인데, 의도하지 않은 동작을 방지하려면 외부 테이블을 만들 때 둘 중 하나만 지정해야 합니다.

선택적 매개 변수

col_name

열 식별자(예: 이름)를 지정하는 문자열입니다. 테이블 식별자에 대한 모든 요구 사항은 열 식별자에도 적용됩니다.

자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.

col_type

열의 데이터 타입을 지정하는 문자열(상수)입니다. 데이터 타입은 열에 대한 expr 의 결과와 일치해야 합니다.

테이블 열에 지정할 수 있는 데이터 타입에 대한 자세한 내용은 데이터 타입 을 참조하십시오.

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

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_CREATEAUTO_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 명령에서 원자적으로(즉, 같은 트랜잭션 내에서) 발생합니다.

ROW ACCESS POLICY <policy_name> ON (VALUE)

테이블에 설정할 행 액세스 정책 을 지정합니다.

행 액세스 정책을 외부 테이블에 적용할 때 VALUE 열을 지정합니다.

TAG tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ]

태그 이름과 태그 문자열 값을 지정합니다.

태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256자입니다.

문에서 태그를 지정하는 방법에 대한 자세한 내용은 오브젝트 및 열에 대한 태그 할당량 섹션을 참조하십시오.

COMMENT = 'string_literal'

외부 테이블에 대한 설명을 지정하는 문자열(리터럴)입니다.

기본값: 값 없음

분할 매개 변수

이러한 매개 변수를 사용하여 외부 테이블을 분할합니다.

part_col_name col_type AS part_expr

외부 테이블에서 하나 이상의 파티션 열을 정의합니다.

파티션 열 정의의 형식은 파티션이 각 파티션 열의 식에서 자동으로 계산되어 추가되는지 아니면 파티션이 수동으로 추가되는지에 따라 다릅니다.

식에서 추가됨

파티션 열은 METADATA$FILENAME 의사 열의 경로 및/또는 파일 이름 정보를 구문 분석하는 식으로 계산해야 합니다. 파티션 열은 스캔할 필요가 없는 데이터 파일을 정리(즉, 외부 테이블 분할)하여 쿼리 성능을 최적화합니다. 파티션은 파티션 열에 대한 식의 경로 및/또는 파일 이름과 일치하는 모든 데이터 파일로 구성됩니다.

part_col_name

파티션 열 식별자(즉, 이름)를 지정하는 문자열입니다. 테이블 식별자에 대한 모든 요구 사항은 열 식별자에도 적용됩니다.

col_type

열의 데이터 타입을 지정하는 문자열(상수)입니다. 데이터 타입은 열에 대한 part_expr 의 결과와 일치해야 합니다.

part_expr

열에 대한 식을 지정하는 문자열입니다. 식은 METADATA$FILENAME 의사 열을 포함해야 합니다.

외부 테이블은 현재 파티션 식에서 다음과 같은 함수 서브세트를 지원합니다.

지원되는 함수의 목록:

수동으로 추가됨

필수: 또한 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')에 대한 구분 기호의 하위 문자열일 수 없습니다.

지정된 구분 기호는 임의의 바이트 시퀀스가 아니라 유효한 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

히브리어

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-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

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

TYPE = ORC

TRIM_SPACE = TRUE | FALSE

문자열에서 선행 공백과 후행 공백을 제거할지 여부를 지정하는 부울입니다.

예를 들어, 외부 데이터베이스 소프트웨어에서 필드를 따옴표로 묶지만 선행 공백을 삽입하는 경우 Snowflake는 여는 따옴표 문자가 아닌 선행 공백을 필드의 시작으로 읽습니다(즉, 따옴표는 필드 데이터 문자열의 일부로 해석됨). 불필요한 공백을 제거하려면 이 옵션을 TRUE 로 설정하십시오.

이 파일 형식 옵션은 다음 작업에만 적용됩니다.

  • 스테이지 상태 ORC 데이터 파일에서 오브젝트 값을 쿼리하는 작업.

  • MATCH_BY_COLUMN_NAME 복사 옵션을 사용하여 ORC 데이터를 별개의 열에서 쿼리하는 작업.

  • COPY 문에 쿼리를 지정하여 별개의 열에서 ORC 데이터를 쿼리하는 작업(즉, COPY 변환).

기본값: 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

액세스 제어 요구 사항

이 SQL 명령을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.

권한

오브젝트

참고

CREATE EXTERNAL TABLE

스키마

CREATE STAGE

스키마

새 스테이지를 만드는 경우에 필요합니다.

USAGE

스테이지

기존 스테이지를 참조하는 경우에 필요합니다.

USAGE

파일 형식

스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.

지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.

보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 Snowflake에서의 액세스 제어 섹션을 참조하십시오.

사용법 노트

  • 외부 테이블은 외부(즉, 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/

  1. 데이터 파일이 저장되는 저장소 위치에 대해 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/'
      ...
      ;
    
  2. 스테이지 상태 데이터에서 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 |
    +----------------------------------------+
    
  3. 분할된 외부 테이블을 만듭니다.

    파티션 열 date_partTO_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);
    
  4. 외부 테이블 메타데이터를 새로 고칩니다.

    ALTER EXTERNAL TABLE et1 REFRESH;
    

외부 테이블을 쿼리할 때 WHERE 절을 사용하여 파티션 열별로 데이터를 필터링합니다. Snowflake는 필터 조건과 일치하는 지정된 파티션의 파일만 검색합니다.

SELECT timestamp, col2 FROM et1 WHERE date_part = to_date('08/05/2018');

수동으로 추가된 파티션

사용자 정의 파티션이 있는 외부 테이블을 만듭니다(즉, 파티션은 외부 테이블 소유자가 수동으로 추가함).

  1. 데이터 파일이 저장되는 저장 위치에 대해 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/'
      ...
      ;
    
  2. 분할된 외부 테이블을 만듭니다. 외부 테이블에는 데이터 타입이 다른 세 개의 파티션 열이 있습니다.

    파티션 식의 열 이름은 대/소문자를 구분합니다. 다음 규칙이 적용됩니다.

    • 파티션 열 이름은 열 이름이 큰따옴표로 묶여 있지 않을 경우 대문자여야 합니다. 또는 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);
    
  3. 파티션 열에 대한 파티션 추가:

    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_partTO_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;
맨 위로 이동