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

-- 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>' , ... ] ) ]
  [ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]

-- 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>' , ... ] ) ]
  [ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
Copy

์—ฌ๊ธฐ์„œ

inlineConstraint ::=
  [ NOT NULL ]
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY | [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> ] ) ] }
  [ <constraint_properties> ]
Copy

์ถ”๊ฐ€ ์ธ๋ผ์ธ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์„ธ๋ถ€ ์ •๋ณด๋Š” CREATE | ALTER TABLE โ€ฆ CONSTRAINT ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

cloudProviderParams (for Google Cloud Storage) ::=
  [ INTEGRATION = '<integration_name>' ]

cloudProviderParams (for Microsoft Azure) ::=
  [ INTEGRATION = '<integration_name>' ]
Copy
externalStage ::=
  @[<namespace>.]<ext_stage_name>[/<path>]
Copy
formatTypeOptions ::=
-- If FILE_FORMAT = ( TYPE = CSV ... )
     COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
     RECORD_DELIMITER = '<string>' | NONE
     FIELD_DELIMITER = '<string>' | NONE
     MULTI_LINE = TRUE | FALSE
     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
     MULTI_LINE = TRUE | FALSE
     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
Copy

๋ฒ ๋ฆฌ์–ธํŠธ ๊ตฌ๋ฌธยถ

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

์ฐธ๊ณ 

์ด ๋ฌธ์ด ๊ฐ™์€ ์ด๋ฆ„์˜ ๊ธฐ์กด ํ…Œ์ด๋ธ”์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋Œ€์ฒด๋˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ๊ถŒํ•œ ๋ถ€์—ฌ๊ฐ€ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด๋ฆ„์˜ ๊ธฐ์กด ํ…Œ์ด๋ธ”์ด ์—†์œผ๋ฉด ๋ณต์ œ๋˜๋Š” ์›๋ณธ ํ…Œ์ด๋ธ”์—์„œ ๊ถŒํ•œ ๋ถ€์—ฌ๊ฐ€ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.

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 ์—์„œ ์Šคํ…Œ์ด์ง•๋œ ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    • ์ €์žฅ์†Œ ์œ„์น˜์— ์žˆ๋Š” ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ถ€๋ถ„ ๊ฒฝ๋กœ(๊ณต์œ  ์ ‘๋‘์‚ฌ)๊ฐ€ ์•„๋‹Œ ์ „์ฒด ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค(์˜ˆ: @my_ext_stage/2025-* ๋Œ€์‹  @my_ext_stage/2025/ ์™€ ๊ฐ™์€ ๊ฒฝ๋กœ ์‚ฌ์šฉ). ๊ณตํ†ต ์ ‘๋‘์‚ฌ๋ฅผ ๊ณต์œ ํ•˜๋Š” ํŒŒ์ผ์„ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด ๋Œ€์‹  ํŒŒํ‹ฐ์…˜ ์—ด์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

    • [ 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 ์˜ต์…˜์„ ์ƒ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FILE_FORMAT ์˜ต์…˜์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์™ธ๋ถ€ ํ…Œ์ด๋ธ” ์ •์˜์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Snowflake๋Š” ์™ธ๋ถ€ ํ…Œ์ด๋ธ” ์ •์˜์—์„œ ์ƒ๋žต๋œ 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)
Copy
๋ฐ˜์ •ํ˜• ๋ฐ์ดํ„ฐ:

์š”์†Œ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค. ์  ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ VALUE ์—ด์—์„œ ๊ฒฝ๋กœ๋ฅผ ํŠธ๋ž˜๋ฒ„์Šคํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํ–‰์ด ์Šคํ…Œ์ด์ง• ์ƒํƒœ ํŒŒ์ผ์—์„œ ๋ฐ˜์ •ํ˜• ๋ฐ์ดํ„ฐ์˜ ๋‹จ์ผ ํ–‰์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์‹ญ์‹œ์˜ค.

{ "a":"1", "b": { "c":"2", "d":"3" } }
Copy

์Šคํ…Œ์ด์ง• ์ƒํƒœ ํŒŒ์ผ์—์„œ ์ค‘์ฒฉ๋œ ๋ฐ˜๋ณต c ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” mycol ๋กœ ๋ช…๋ช…๋œ VARCHAR ์—ด์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

mycol varchar as (value:"b"."c"::varchar)
Copy
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 ์ธ ๊ฒฝ์šฐ) ๋ถ„ํ• ๋œ ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ด ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ TRUE ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ S3 ํ˜ธํ™˜ ์Šคํ† ๋ฆฌ์ง€(S3 REST API ์™€ ํ˜ธํ™˜๋˜๋Š” API ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ์žฅ์น˜)์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์—๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Amazon S3 ํ˜ธํ™˜ ์ €์žฅ์†Œ ์‚ฌ์šฉํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

    ALTER EXTERNAL TABLE โ€ฆ REFRESH ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒˆ ๋ฐ์ดํ„ฐ ๋˜๋Š” ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€ ํ…Œ์ด๋ธ” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ Snowflake์— ์•Œ๋ฆฌ๋„๋ก ์ €์žฅ์†Œ ์œ„์น˜์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ์•Œ๋ฆผ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ ์„œ๋น„์Šค์˜ ์ง€์นจ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๋ฉด 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

์ฐธ๊ณ 

์ด ๊ธฐ๋Šฅ์€ ๊ณ„์† ์ง€์›๋˜์ง€๋งŒ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  Apache Icebergโ„ข ํ…Œ์ด๋ธ” ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Iceberg ํ…Œ์ด๋ธ”์€ ์™ธ๋ถ€ ๋ณผ๋ฅจ ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ์— ์žˆ๋Š” Delta ํ…Œ์ด๋ธ” ํŒŒ์ผ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Iceberg ํ…Œ์ด๋ธ” ๋ฐ CREATE ICEBERG TABLE(์˜ค๋ธŒ์ ํŠธ ์ €์žฅ์†Œ์˜ Delta ํŒŒ์ผ) ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. Delta ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์„ Apache Icebergโ„ข ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ ์œ„์น˜์—์„œ 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์ž์ž…๋‹ˆ๋‹ค.

๋ฌธ์—์„œ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ํƒœ๊ทธ ํ• ๋‹น๋Ÿ‰ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

WITH CONTACT ( purpose = contact [ , purpose = contact ...] )

์ƒˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ์˜ ์—ฐ๋ฝ์ฒ˜ ์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋ถ„ํ•  ๋งค๊ฐœ ๋ณ€์ˆ˜ยถ

์ด๋Ÿฌํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์„ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.

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

ํ…Œ์ด๋ธ”์˜ ํŒŒํ‹ฐ์…˜ ์—ด์„ ์ •์˜ํ•œ ํ›„ 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 = 'string' | 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 = 'string' | 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 ์˜ ๊ฐ’๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’: ์‰ผํ‘œ(,)

MULTI_LINE = TRUE | FALSE

์—ฌ๋Ÿฌ ์ค„ ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค.

MULTI_LINE ์ด FALSE ๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ  ์ง€์ •๋œ ๋ ˆ์ฝ”๋“œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ CSV ํ•„๋“œ ๋‚ด์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’: TRUE

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

์ด ์˜ˆ์—์„œ ๋Œ€๊ด„ํ˜ธ๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๊ด„ํ˜ธ๋Š” ๋ฐ˜ํ™˜๋œ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘๊ณผ ๋์˜ ๊ฒฝ๊ณ„๋ฅผ ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’: FALSE

FIELD_OPTIONALLY_ENCLOSED_BY = 'character' | NONE

๋ฌธ์ž์—ด์„ ๋ฌถ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ๊ฐ’์€ NONE, ์ž‘์€๋”ฐ์˜ดํ‘œ ๋ฌธ์ž(') ๋˜๋Š” ํฐ๋”ฐ์˜ดํ‘œ ๋ฌธ์ž(")์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€๋”ฐ์˜ดํ‘œ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด 8์ง„์ˆ˜ ๋˜๋Š” 16์ง„์ˆ˜ ํ‘œํ˜„(0x27) ๋˜๋Š” ์ด์ค‘ ์ž‘์€๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ธ ์ด์Šค์ผ€์ดํ”„('')๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ธฐ๋ณธ๊ฐ’: NONE

NULL_IF = ( 'string1' [ , 'string2' , ... ] )

SQL NULL๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž์—ด:

๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•  ๋•Œ Snowflake๋Š” ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ์—์„œ ์ด๋Ÿฌํ•œ ๊ฐ’์„ SQL NULL๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋‘˜ ์ด์ƒ์˜ ๋ฌธ์ž์—ด์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋ฌธ์ž์—ด ๋ชฉ๋ก์„ ๊ด„ํ˜ธ๋กœ ๋ฌถ๊ณ  ์‰ผํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ๊ฐ์˜ ๊ฐ’์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

Snowflake๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ด€๊ณ„์—†์ด ๊ฐ’์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ NULL๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2 ๊ฐ€ ๊ฐ’์œผ๋กœ ์ง€์ •๋˜๋ฉด 2 ์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฌธ์ž์—ด ๋˜๋Š” ์ˆซ์ž๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

์˜ˆ:

NULL_IF = ('\N', 'NULL', 'NUL', '')

์ด ์˜ต์…˜์—๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’: \N (์ฆ‰, NULL, ESCAPE_UNENCLOSED_FIELD ๊ฐ’์€ \\ ๋กœ ๊ฐ€์ •)

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

WINDOWS874

ํƒœ๊ตญ์–ด

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

MULTI_LINE = TRUE | FALSE

์—ฌ๋Ÿฌ ์ค„ ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค.

MULTI_LINE ์ด FALSE ๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ  JSON ๋ ˆ์ฝ”๋“œ ๋‚ด์— ์ƒˆ ์ค„์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ ์ค„์ด ํฌํ•จ๋œ ๋ ˆ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’: TRUE

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 (์ฆ‰, 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

์•ก์„ธ์Šค ์ œ์–ด ์š”๊ตฌ ์‚ฌํ•ญยถ

์ด ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—ญํ•  ์—๋Š” ์ตœ์†Œํ•œ ๋‹ค์Œ ๊ถŒํ•œ ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ

์˜ค๋ธŒ์ ํŠธ

์ฐธ๊ณ 

CREATE EXTERNAL TABLE

์Šคํ‚ค๋งˆ

CREATE STAGE

์Šคํ‚ค๋งˆ

์ƒˆ ์Šคํ…Œ์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

USAGE

์Šคํ…Œ์ด์ง€

๊ธฐ์กด ์Šคํ…Œ์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

USAGE

ํŒŒ์ผ ํ˜•์‹

์Šคํ‚ค๋งˆ์˜ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ƒ์œ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ USAGE ๊ถŒํ•œ.

์ง€์ •๋œ ๊ถŒํ•œ ์„ธํŠธ๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ• ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์€ ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ•  ๋งŒ๋“ค๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ณด์•ˆ ์˜ค๋ธŒ์ ํŠธ ์— ๋Œ€ํ•ด SQL ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์—ญํ• ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด๋Š” ์•ก์„ธ์Šค ์ œ์–ด์˜ ๊ฐœ์š” ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์‚ฌ์šฉ๋ฒ• ๋…ธํŠธยถ

  • ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์€ ์™ธ๋ถ€(S3, Azure ๋˜๋Š” GCS) ์Šคํ…Œ์ด์ง€๋งŒ ์ง€์›ํ•˜๋ฉฐ ๋‚ด๋ถ€(Snowflake) ์Šคํ…Œ์ด์ง€๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์€ ์Šคํ† ๋ฆฌ์ง€ ๋ฒ„์ „ ๊ด€๋ฆฌ(S3 ๋ฒ„์ „ ๊ด€๋ฆฌ, Google Cloud Storage์˜ ์˜ค๋ธŒ์ ํŠธ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋˜๋Š” Azure Storage์šฉ ๋ฒ„์ „ ๊ด€๋ฆฌ)๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์‚ฌ์šฉ์ž๋Š” ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์ „์— ๋ณต์›์ด ํ•„์š”ํ•œ ์•„์นด์ด๋ธŒ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ ํด๋ž˜์Šค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•„์นด์ด๋ธŒ ์ €์žฅ์†Œ ํด๋ž˜์Šค๋กœ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด 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 ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • OR REPLACE ๋ฐ IF NOT EXISTS ์ ˆ์€ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฌธ์ž๋ฅผ ๊ฐ™์€ ๋ฌธ์— ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆยถ

ํŒŒํ‹ฐ์…˜ ์—ด ์‹์—์„œ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋œ ํŒŒํ‹ฐ์…˜ยถ

ํŒŒํ‹ฐ์…˜ ์—ด ์ •์˜์˜ ์‹์—์„œ ๊ณ„์‚ฐ๋œ ํŒŒํ‹ฐ์…˜์ด ์žˆ๋Š” ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์€ ๋‹ค์Œ ๊ตฌ์กฐ๋กœ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ์— ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. 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/'
      ...
      ;
    
    Copy

    Google Cloud Storage

    CREATE STAGE s1
      URL='gcs://mybucket/files/logs/'
      ...
      ;
    
    Copy

    Microsoft Azure

    CREATE STAGE s1
      URL='azure://mycontainer/files/logs/'
      ...
      ;
    
    Copy
  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 |
    +----------------------------------------+
    
    Copy
  3. ๋ถ„ํ• ๋œ ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ํŒŒํ‹ฐ์…˜ ์—ด 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';
    
    Copy

    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);
    
    Copy

    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);
    
    Copy
  4. ์™ธ๋ถ€ ํ…Œ์ด๋ธ” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ๊ณ ์นฉ๋‹ˆ๋‹ค.

    ALTER EXTERNAL TABLE et1 REFRESH;
    
    Copy

์™ธ๋ถ€ ํ…Œ์ด๋ธ”์„ ์ฟผ๋ฆฌํ•  ๋•Œ WHERE ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒํ‹ฐ์…˜ ์—ด๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. Snowflake๋Š” ํ•„ํ„ฐ ์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•˜๋Š” ์ง€์ •๋œ ํŒŒํ‹ฐ์…˜์˜ ํŒŒ์ผ๋งŒ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

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

์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€๋œ ํŒŒํ‹ฐ์…˜ยถ

์‚ฌ์šฉ์ž ์ •์˜ ํŒŒํ‹ฐ์…˜์ด ์žˆ๋Š” ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค(์ฆ‰, ํŒŒํ‹ฐ์…˜์€ ์™ธ๋ถ€ ํ…Œ์ด๋ธ” ์†Œ์œ ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•จ).

  1. ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด ์ €์žฅ๋˜๋Š” ์ €์žฅ ์œ„์น˜์— ๋Œ€ํ•ด s2 ๋ผ๋Š” ์™ธ๋ถ€ ์Šคํ…Œ์ด์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ์Šคํ…Œ์ด์ง€ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฝ๋กœ /files/logs/ ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

    Amazon S3

    CREATE STAGE s2
      URL='s3://mybucket/files/logs/'
      ...
      ;
    
    Copy

    Google Cloud Storage

    CREATE STAGE s2
      URL='gcs://mybucket/files/logs/'
      ...
      ;
    
    Copy

    Microsoft Azure

    CREATE STAGE s2
      URL='azure://mycontainer/files/logs/'
      ...
      ;
    
    Copy
  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);
    
    Copy
  3. ํŒŒํ‹ฐ์…˜ ์—ด์— ๋Œ€ํ•œ ํŒŒํ‹ฐ์…˜ ์ถ”๊ฐ€:

    ALTER EXTERNAL TABLE et2 ADD PARTITION(col1='2022-01-24', col2='a', col3='12') LOCATION '2022/01';
    
    Copy

    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. |
    +---------------------------------------+----------------+-------------------------------+
    
    Copy

์™ธ๋ถ€ ํ…Œ์ด๋ธ”์„ ์ฟผ๋ฆฌํ•  ๋•Œ WHERE ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒํ‹ฐ์…˜ ์—ด๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ์Šคํ…Œ์ด์ง•๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์— ์ €์žฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

SELECT col1, col2, col3 FROM et1 WHERE col1 = TO_DATE('2022-01-24') AND col2 = 'a' ORDER BY METADATA$FILE_ROW_NUMBER;
Copy

์™ธ๋ถ€ ํ…Œ์ด๋ธ”์˜ ๊ตฌ์ฒดํ™”๋œ ๋ทฐยถ

ํŒŒํ‹ฐ์…˜ ์—ด ์‹์—์„œ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋œ ํŒŒํ‹ฐ์…˜ ์˜ˆ์—์„œ ๋งŒ๋“ค์–ด์ง„ ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์˜ ์—ด ํ•˜์œ„ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ฒดํ™”๋œ ๋ทฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

CREATE MATERIALIZED VIEW et1_mv
  AS
  SELECT col2 FROM et1;
Copy

์ด 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;
Copy

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