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> ... ] ) ]
์ฌ๊ธฐ์
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 = '<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
๋ฒ ๋ฆฌ์ธํธ ๊ตฌ๋ฌธยถ
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
์์ ์คํ ์ด์ง๋ ํ์ผ์ ์ฝ์ต๋๋ค.์ฐธ๊ณ
์ ์ฅ์ ์์น์ ์๋ ํ์ผ์ ๋ํด ๋ถ๋ถ ๊ฒฝ๋ก(๊ณต์ ์ ๋์ฌ)๊ฐ ์๋ ์ ์ฒด ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ญ์์ค(์:
@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)
- ๋ฐ์ ํ ๋ฐ์ดํฐ:
์์ ์ด๋ฆ๊ณผ ๊ฐ์ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ต๋๋ค. ์ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ 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
์ธ ๊ฒฝ์ฐ) ๋ถํ ๋ ์ธ๋ถ ํ ์ด๋ธ์์ ์ง์๋์ง ์์ต๋๋ค.์ด ๋งค๊ฐ ๋ณ์๋ฅผ 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 ์์ฌ ์ด์ ํฌํจํด์ผ ํฉ๋๋ค.
์ธ๋ถ ํ ์ด๋ธ์ ํ์ฌ ํํฐ์ ์์์ ๋ค์๊ณผ ๊ฐ์ ํจ์ ์๋ธ์ธํธ๋ฅผ ์ง์ํฉ๋๋ค.
์ง์๋๋ ํจ์ ๋ชฉ๋ก:
=
,<>
,>
,>=
,<
,<=
||
+
,-
-
(๋ถ์ )*
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 = '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<
์ด ์์์ ๋๊ดํธ๋ ๋ฐํ๋์ง ์์ต๋๋ค. ๋๊ดํธ๋ ๋ฐํ๋ ๋ฌธ์์ด์ ์์๊ณผ ๋์ ๊ฒฝ๊ณ๋ฅผ ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ:
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/
๋ฐ์ดํฐ ํ์ผ์ด ์ ์ฅ๋๋ ์ ์ฅ์ ์์น์ ๋ํด
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;
์ธ๋ถ ํ ์ด๋ธ์ ๊ตฌ์ฒดํ๋ ๋ทฐยถ
ํํฐ์ ์ด ์์์ ์๋์ผ๋ก ์ถ๊ฐ๋ ํํฐ์ ์์์ ๋ง๋ค์ด์ง ์ธ๋ถ ํ ์ด๋ธ์ ์ด ํ์ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฒดํ๋ ๋ทฐ๋ฅผ ๋ง๋ญ๋๋ค.
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;