COPY INTO <ํ ์ด๋ธ>ยถ
ํ์ผ์์ ๊ธฐ์กด ํ ์ด๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํฉ๋๋ค. ํ์ผ์ ๋ค์ ์์น ์ค ํ๋์ ์ด๋ฏธ ์์ด์ผ ํฉ๋๋ค.
๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง(๋๋ ํ ์ด๋ธ/์ฌ์ฉ์ ์คํ ์ด์ง). PUT ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์คํ ์ด์งํ ์ ์์ต๋๋ค.
์ธ๋ถ ์์น๋ฅผ ์ฐธ์กฐํ๋ ๋ช ๋ช ๋ ์ธ๋ถ ์คํ ์ด์ง(Amazon S3, Google Cloud Storage ๋๋ Microsoft Azure).
์ฌ์ฉ์๋ ๊ฒ์ํ๊ธฐ ์ ์ ๋ณต์์ด ํ์ํ ์์นด์ด๋ธ ํด๋ผ์ฐ๋ ์ ์ฅ์ ํด๋์ค์ ์๋ ๋ฐ์ดํฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์นด์ด๋ธ ์ ์ฅ์ ํด๋์ค๋ก๋ ์๋ฅผ ๋ค์ด Amazon S3 Glacier Flexible Retrieval ๋๋ Glacier Deep Archive ์ ์ฅ์ ํด๋์ค ๋๋ Microsoft Azure Archive Storage ๋ฑ์ด ์์ต๋๋ค.
์ธ๋ถ ์์น(Amazon S3, Google Cloud Storage ๋๋ Microsoft Azure).
- ์ฐธ๊ณ ํญ๋ชฉ:
๊ตฌ๋ฌธยถ
/* Standard data load */
COPY INTO [<namespace>.]<table_name>
FROM { internalStage | externalStage | externalLocation }
[ FILES = ( '<file_name>' [ , '<file_name>' ] [ , ... ] ) ]
[ PATTERN = '<regex_pattern>' ]
[ FILE_FORMAT = ( { FORMAT_NAME = '[<namespace>.]<file_format_name>' |
TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
[ copyOptions ]
[ VALIDATION_MODE = RETURN_<n>_ROWS | RETURN_ERRORS | RETURN_ALL_ERRORS ]
/* Data load with transformation */
COPY INTO [<namespace>.]<table_name> [ ( <col_name> [ , <col_name> ... ] ) ]
FROM ( SELECT [<alias>.]$<file_col_num>[.<element>] [ , [<alias>.]$<file_col_num>[.<element>] ... ]
FROM { internalStage | externalStage } )
[ FILES = ( '<file_name>' [ , '<file_name>' ] [ , ... ] ) ]
[ PATTERN = '<regex_pattern>' ]
[ FILE_FORMAT = ( { FORMAT_NAME = '[<namespace>.]<file_format_name>' |
TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
[ copyOptions ]
์ฌ๊ธฐ์
internalStage ::= @[<namespace>.]<int_stage_name>[/<path>] | @[<namespace>.]%<table_name>[/<path>] | @~[/<path>]externalStage ::= @[<namespace>.]<ext_stage_name>[/<path>]externalLocation (for Amazon S3) ::= '<protocol>://<bucket>[/<path>]' [ { STORAGE_INTEGRATION = <integration_name> } | { CREDENTIALS = ( { { AWS_KEY_ID = '<string>' AWS_SECRET_KEY = '<string>' [ AWS_TOKEN = '<string>' ] } } ) } ] [ ENCRYPTION = ( [ TYPE = 'AWS_CSE' ] [ MASTER_KEY = '<string>' ] | [ TYPE = 'AWS_SSE_S3' ] | [ TYPE = 'AWS_SSE_KMS' [ KMS_KEY_ID = '<string>' ] ] | [ TYPE = 'NONE' ] ) ]externalLocation (for Google Cloud Storage) ::= 'gcs://<bucket>[/<path>]' [ STORAGE_INTEGRATION = <integration_name> ] [ ENCRYPTION = ( [ TYPE = 'GCS_SSE_KMS' ] [ KMS_KEY_ID = '<string>' ] | [ TYPE = 'NONE' ] ) ]externalLocation (for Microsoft Azure) ::= 'azure://<account>.blob.core.windows.net/<container>[/<path>]' [ { STORAGE_INTEGRATION = <integration_name> } | { CREDENTIALS = ( [ AZURE_SAS_TOKEN = '<string>' ] ) } ] [ ENCRYPTION = ( [ TYPE = { 'AZURE_CSE' | 'NONE' } ] [ MASTER_KEY = '<string>' ] ) ]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 PARSE_HEADER = TRUE | FALSE SKIP_HEADER = <integer> SKIP_BLANK_LINES = TRUE | FALSE DATE_FORMAT = '<string>' | AUTO TIME_FORMAT = '<string>' | AUTO TIMESTAMP_FORMAT = '<string>' | AUTO BINARY_FORMAT = HEX | BASE64 | UTF8 ESCAPE = '<character>' | NONE ESCAPE_UNENCLOSED_FIELD = '<character>' | NONE TRIM_SPACE = TRUE | FALSE FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | NONE NULL_IF = ( [ '<string>' [ , '<string>' ... ] ] ) ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE EMPTY_FIELD_AS_NULL = TRUE | FALSE SKIP_BYTE_ORDER_MARK = TRUE | FALSE ENCODING = '<string>' | UTF8 -- If FILE_FORMAT = ( TYPE = JSON ... ) COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE DATE_FORMAT = '<string>' | AUTO TIME_FORMAT = '<string>' | AUTO TIMESTAMP_FORMAT = '<string>' | AUTO BINARY_FORMAT = HEX | BASE64 | UTF8 TRIM_SPACE = TRUE | FALSE MULTI_LINE = TRUE | FALSE NULL_IF = ( [ '<string>' [ , '<string>' ... ] ] ) ENABLE_OCTAL = TRUE | FALSE ALLOW_DUPLICATE = TRUE | FALSE STRIP_OUTER_ARRAY = TRUE | FALSE STRIP_NULL_VALUES = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE IGNORE_UTF8_ERRORS = TRUE | FALSE SKIP_BYTE_ORDER_MARK = TRUE | FALSE -- If FILE_FORMAT = ( TYPE = AVRO ... ) COMPRESSION = AUTO | GZIP | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE TRIM_SPACE = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE NULL_IF = ( [ '<string>' [ , '<string>' ... ] ] ) -- 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 USE_LOGICAL_TYPE = TRUE | FALSE TRIM_SPACE = TRUE | FALSE USE_VECTORIZED_SCANNER = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE NULL_IF = ( [ '<string>' [ , '<string>' ... ] ] ) -- If FILE_FORMAT = ( TYPE = XML ... ) COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE IGNORE_UTF8_ERRORS = TRUE | FALSE PRESERVE_SPACE = TRUE | FALSE STRIP_OUTER_ELEMENT = TRUE | FALSE DISABLE_AUTO_CONVERT = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE SKIP_BYTE_ORDER_MARK = TRUE | FALSEcopyOptions ::= ON_ERROR = { CONTINUE | SKIP_FILE | SKIP_FILE_<num> | 'SKIP_FILE_<num>%' | ABORT_STATEMENT } SIZE_LIMIT = <num> PURGE = TRUE | FALSE RETURN_FAILED_ONLY = TRUE | FALSE MATCH_BY_COLUMN_NAME = CASE_SENSITIVE | CASE_INSENSITIVE | NONE INCLUDE_METADATA = ( <column_name> = METADATA$<field> [ , <column_name> = METADATA${field} ... ] ) ENFORCE_LENGTH = TRUE | FALSE TRUNCATECOLUMNS = TRUE | FALSE FORCE = TRUE | FALSE LOAD_UNCERTAIN_FILES = TRUE | FALSE FILE_PROCESSOR = (SCANNER = <custom_scanner_type> SCANNER_OPTIONS = (<scanner_options>)) LOAD_MODE = { FULL_INGEST | ADD_FILES_COPY }
ํ์ ๋งค๊ฐ ๋ณ์ยถ
[namespace.]table_name
๋ฐ์ดํฐ๊ฐ ๋ก๋ฉ๋๋ ๋์ ํ ์ด๋ธ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
๋ค์์คํ์ด์ค๋
database_name.schema_name
๋๋schema_name
ํ์์ผ๋ก ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ/๋๋ ์คํค๋ง๋ฅผ ์ ํ์ ์ผ๋ก ์ง์ ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง๊ฐ ํ์ฌ ์ฌ์ฉ์ ์ธ์ ๋ด์์ ์ฌ์ฉ ์ค์ธ ๊ฒฝ์ฐ ์ด๋ ์ ํ ์ฌํญ ์ ๋๋ค. ์ฌ์ฉ ์ค์ด์ง ์์ผ๋ฉด ํ์ ์ฌํญ์ ๋๋ค.FROM ...
๋ก๋ฉํ ๋ฐ์ดํฐ๊ฐ ์๋ ํ์ผ์ ์คํ ์ด์งํ๋ ๋ด๋ถ ๋๋ ์ธ๋ถ ์์น๋ฅผ ์ง์ ํฉ๋๋ค.
@[namespace.]int_stage_name[/path]
ํ์ผ์ด ์ง์ ๋ ๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง์ ์์ต๋๋ค.
@[namespace.]ext_stage_name[/path]
ํ์ผ์ด ์ง์ ๋ ๋ช ๋ช ๋ ์ธ๋ถ ์คํ ์ด์ง์ ์์ต๋๋ค.
@[namespace.]%table_name[/path]
ํ์ผ์ด ์ง์ ๋ ํ ์ด๋ธ์ ์คํ ์ด์ง์ ์์ต๋๋ค.
@~[/path]
ํ์ผ์ด ํ์ฌ ์ฌ์ฉ์์ ์คํ ์ด์ง์ ์์ต๋๋ค.
'protocol://bucket[/path]'
ํ์ผ์ด ์ง์ ๋ ์ธ๋ถ ์์น(S3 ๋ฒํท)์ ์์ต๋๋ค. ์ถ๊ฐ ๋งค๊ฐ ๋ณ์๊ฐ ํ์ํ ์๋ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ํญ๋ชฉ์ ์๋ ์ถ๊ฐ ํด๋ผ์ฐ๋ ๊ณต๊ธ์ ๋งค๊ฐ ๋ณ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
'gcs://bucket[/path]'
ํ์ผ์ด ์ง์ ๋ ์ธ๋ถ ์์น(Google Cloud Storage ๋ฒํท)์ ์์ต๋๋ค. ์ถ๊ฐ ๋งค๊ฐ ๋ณ์๊ฐ ํ์ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ํญ๋ชฉ์ ์๋ ์ถ๊ฐ ํด๋ผ์ฐ๋ ๊ณต๊ธ์ ๋งค๊ฐ ๋ณ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
'azure://account.blob.core.windows.net/container[/path]'
ํ์ผ์ด ์ง์ ๋ ์ธ๋ถ ์์น(Azure ์ปจํ ์ด๋)์ ์์ต๋๋ค. ์ถ๊ฐ ๋งค๊ฐ ๋ณ์๊ฐ ํ์ํ ์๋ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ํญ๋ชฉ์ ์๋ ์ถ๊ฐ ํด๋ผ์ฐ๋ ๊ณต๊ธ์ ๋งค๊ฐ ๋ณ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฌ๊ธฐ์
namespace
๋database_name.schema_name
๋๋schema_name
ํ์์ ๋ด๋ถ ๋๋ ์ธ๋ถ ์คํ ์ด์ง๊ฐ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ/๋๋ ์คํค๋ง์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง๊ฐ ํ์ฌ ์ฌ์ฉ์ ์ธ์ ๋ด์์ ์ฌ์ฉ ์ค์ธ ๊ฒฝ์ฐ ์ด๋ ์ ํ ์ฌํญ ์ ๋๋ค. ์ฌ์ฉ ์ค์ด์ง ์์ผ๋ฉด ํ์ ์ฌํญ์ ๋๋ค.protocol
์ ๋ค์ ์ค ํ๋์ ๋๋ค.s3
์ ์ค๊ตญ ์ธ๋ถ์ ์๋ ๊ณต์ฉ AWS ๋ฆฌ์ ์ S3 ์ ์ฅ์๋ฅผ ๋ํ๋ ๋๋ค.s3china
๋ ์ค๊ตญ์ ์๋ ๊ณต์ฉ AWS ๋ฆฌ์ ์ S3 ์ ์ฅ์๋ฅผ ๋ํ๋ ๋๋ค.s3gov
๋ ์ ๋ถ ๋ฆฌ์ ์ S3 ์ ์ฅ์๋ฅผ ๋ํ๋ ๋๋ค.
์ ์ฅ์ ํตํฉ์ ์ฌ์ฉํ์ฌ ์ ๋ถ ๋ฆฌ์ ์ ํด๋ผ์ฐ๋ ์ ์ฅ์์ ์ก์ธ์คํ๋ ๊ฒ์ ๋์ผํ ์ ๋ถ ๋ฆฌ์ ์ ํธ์คํ ๋ Snowflake ๊ณ์ ์ผ๋ก ์ ํ๋ฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ์ค๊ตญ์ ์๋ ๋ฆฌ์ ์ ํด๋ผ์ฐ๋ ์ ์ฅ์์ ์ก์ธ์คํด์ผ ํ๋ ๊ฒฝ์ฐ ์ค๊ตญ ๋ด ๋์ผํ ๋ฆฌ์ ์ ํธ์คํ ๋ Snowflake ๊ณ์ ์์๋ง ์ ์ฅ์ ํตํฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ ์ฅ์ ํตํฉ์ ์ฌ์ฉํ๋ ๋์ CREATE STAGE ๋ช ๋ น์ CREDENTIALS ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์ ์ํ ์๊ฒฉ ์ฆ๋ช ์ ์ ๊ณตํ์ญ์์ค.
bucket
์ ๋ฒํท์ ์ด๋ฆ์ ๋๋ค.
account
๋ Azure ๊ณ์ ์ ์ด๋ฆ์ ๋๋ค(์:myaccount
). Data Lake Storage Gen2๋ฅผ ํฌํจํ์ฌ, ์ง์๋๋ ๋ชจ๋ ํ์ ์ Azure blob ์ ์ฅ์ ๊ณ์ ์ ๋ํดblob.core.windows.net
์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.ํ์ฌ, ์ ์ฅ์ ํตํฉ์ ์ฌ์ฉํ์ฌ ์ ๋ถ ๋ฆฌ์ ์ Azure blob ์ ์ฅ์์ ์ก์ธ์คํ๋ ๊ฒ์ ๋์ผํ ์ ๋ถ ๋ฆฌ์ ์ Azure์ ํธ์คํ ๋ Snowflake ๊ณ์ ์ผ๋ก ์ ํ๋ฉ๋๋ค. ์ง์ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ์ ๋ถ ๋ฆฌ์ ์ธ๋ถ์ ํธ์คํ ๋ ๊ณ์ ์์ blob ์ ์ฅ์์ ์ก์ธ์คํ๋ ๊ธฐ๋ฅ์ด ์ง์๋ฉ๋๋ค.
container
๋ Azure ์ปจํ ์ด๋์ ์ด๋ฆ์ ๋๋ค(์:mycontainer
).
path
๋ ๋ก๋ฉํ ํ์ผ ์ธํธ๋ฅผ ์ ํํ๋ ํด๋ผ์ฐ๋ ์ ์ฅ์ ์์น์ ์๋ ํ์ผ์ ์ ํ์ ๊ฒฝ๋ก๋ก, ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค(์ฆ, ํ์ผ ์ด๋ฆ์ด ๊ณตํต ๋ฌธ์์ด๋ก ์์ํจ). ๋ค๋ฅธ ํด๋ผ์ฐ๋ ์ ์ฅ์ ์๋น์ค์์๋ ๊ฒฝ๋ก๋ฅผ ์ ๋์ฌ ๋๋ ํด๋ ๋ผ๊ณ ๋ ํฉ๋๋ค.โ๊ฒฝ๋กโ๋ ์ด๋ฆ์ ๋ฆฌํฐ๋ด ์ ๋์ฌ์ด๋ฏ๋ก,
/./
๋ฐ/../
์ ๊ฐ์ ์๋ ๊ฒฝ๋ก ํ์ ์๋ ๋ฌธ์ ๊ทธ๋๋ก ํด์๋ฉ๋๋ค. ์:-- S3 bucket COPY INTO mytable FROM 's3://mybucket/./../a.csv'; -- Google Cloud Storage bucket COPY INTO mytable FROM 'gcs://mybucket/./../a.csv'; -- Azure container COPY INTO mytable FROM 'azure://myaccount.blob.core.windows.net/mycontainer/./../a.csv';
์ด๋ฌํ COPY ๋ฌธ์์ Snowflake๋ ์ธ๋ถ ์์น์ ๋ฌธ์ ๊ทธ๋๋ก
./../a.csv
๋ก ๋ช ๋ช ๋ ํ์ผ์ ์ฐพ์ต๋๋ค.
์ฐธ๊ณ
๋ด๋ถ ๋๋ ์ธ๋ถ ์คํ ์ด์ง๋ ๊ฒฝ๋ก ์ด๋ฆ์ ๊ณต๋ฐฑ์ ํฌํจํ ํน์ ๋ฌธ์๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ,
FROM ...
๋ฌธ์์ด์ ์์๋ฐ์ดํ๋ก ๋ฌถ์ต๋๋ค.FROM ...
๊ฐ์ ๋ฆฌํฐ๋ด ์์์ฌ์ผ ํฉ๋๋ค. ์ด ๊ฐ์ด SQL ๋ณ์ ์ผ ์๋ ์์ต๋๋ค.
์ถ๊ฐ ํด๋ผ์ฐ๋ ๊ณต๊ธ์ ๋งค๊ฐ ๋ณ์ยถ
STORAGE_INTEGRATION = integration_name
๋๋ .CREDENTIALS = ( cloud_specific_credentials )
COPY ๋ฌธ์ FROM ๊ฐ์ด ์ธ๋ถ ์คํ ์ด์ง ์ด๋ฆ์ด ์๋ ์ธ๋ถ ์ ์ฅ์ URI์ผ ๋ ์ง์๋ฉ๋๋ค.
์ธ๋ถ ๊ฐ์ธ/๋ณดํธ๋ ํด๋ผ์ฐ๋ ์ ์ฅ์ ์์น์์ ๋ก๋ฉํ๋ ๊ฒฝ์ฐ์๋ง ํ์ํ๋ฉฐ, ๊ณต์ฉ ๋ฒํท/์ปจํ ์ด๋์๋ ํ์ํ์ง ์์
ํด๋ผ์ฐ๋ ๊ณต๊ธ์์ ์ฐ๊ฒฐํ๊ณ ๋ฐ์ดํฐ ํ์ผ์ด ์คํ ์ด์ง๋๋ ๊ฐ์ธ/๋ณดํธ๋ ์ ์ฅ์ ์ปจํ ์ด๋์ ์ก์ธ์คํ๊ธฐ ์ํ ๋ณด์ ์๊ฒฉ ์ฆ๋ช ์ ์ง์ ํฉ๋๋ค.
Amazon S3
STORAGE_INTEGRATION = integration_name
์ธ๋ถ ํด๋ผ์ฐ๋ ์ ์ฅ์์ ๋ํ ์ธ์ฆ ์ฑ ์์ Snowflake ID ๋ฐ ์ก์ธ์ค ๊ด๋ฆฌ(IAM) ์ํฐํฐ์ ์์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ ์ฅ์ ํตํฉ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ CREATE STORAGE INTEGRATION ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
์ ์ฅ์ ํตํฉ์ ๊ผญ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด ์คํ ์ด์ง๋ฅผ ๋ง๋ค๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ๋ CREDENTIALS ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ฐ๋ ์ ์ฅ์ ์๊ฒฉ ์ฆ๋ช ์ ์ ๊ณตํ ํ์๊ฐ ์์ต๋๋ค.
CREDENTIALS = ( AWS_KEY_ID = 'string' AWS_SECRET_KEY = 'string' [ AWS_TOKEN = 'string' ] )
AWS์ ์ฐ๊ฒฐํ๊ณ ๋ก๋ฉํ ํ์ผ์ด ์คํ ์ด์ง๋๋ ๊ฐ์ธ/๋ณดํธ๋ S3 ๋ฒํท์ ์ก์ธ์คํ๊ธฐ ์ํ ๋ณด์ ์๊ฒฉ ์ฆ๋ช ์ ์ง์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Amazon S3์ ๋ํ ๋ณด์ ์ก์ธ์ค ๊ตฌ์ฑํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ง์ ํ๋ ์๊ฒฉ ์ฆ๋ช ์ ๋ฒํท์ ๋ํ Snowflake ์ก์ธ์ค ํ๊ฐ๋ฅผ AWS IAM(Identity & Access Management) ์ฌ์ฉ์ ๋๋ ์ญํ ๊ณผ ์ฐ๊ฒฐํ๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
IAM ์ฌ์ฉ์: ์์ IAM ์๊ฒฉ ์ฆ๋ช ์ด ํ์ํฉ๋๋ค. ์์(์ผ๋ช โ๋ฒ์ ์ง์ โ) ์๊ฒฉ ์ฆ๋ช ์ AWS STS(Security Token Service)์ ์ํด ์์ฑ๋๋ฉฐ ๋ค์ ์ธ ๊ฐ์ง ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ง๋๋ค.
AWS_KEY_ID
AWS_SECRET_KEY
AWS_TOKEN
๊ฐ์ธ/๋ณดํธ๋ ๋ฒํท์ ์ก์ธ์คํ๋ ค๋ฉด ์ธ ๊ฐ์ง๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค. ์ง์ ๋ ๊ธฐ๊ฐ์ด ์ง๋๋ฉด ์์ ์๊ฒฉ ์ฆ๋ช ์ด ๋ง๋ฃ๋์ด ๋ ์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํจํ ์์ ์๊ฒฉ ์ฆ๋ช ์ผ๋ก ๊ตฌ์ฑ๋ ์ ์ธํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์ค์
COPY ๋ช ๋ น์๋ ์๊ฒฉ ์ฆ๋ช ๊ณผ ๊ฐ์ ๋ณต์กํ ๊ตฌ๋ฌธ๊ณผ ์ค์ํ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ํ, ์ด๋ฐ ๋ช ๋ น์ ์์ฃผ ์คํ๋๊ณ ์คํฌ๋ฆฝํธ๋ ์ํฌ์ํธ์ ์ข ์ข ์ ์ฅ๋๋ฏ๋ก, ์ค์ํ ์ ๋ณด๊ฐ ์ค์๋ก ๋ ธ์ถ๋ ์ ์์ต๋๋ค. COPY ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ์๊ตฌ์ ์ธ(์ผ๋ช โ์ฅ๊ธฐโ) ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ ์๋ ์์ง๋ง, ๋ณด์์์ ์ด์ ๋ก COPY ๋ช ๋ น์ ์๊ตฌ์ ์ธ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๋์ ์ ์์ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ญ์์ค.
์๊ตฌ์ ์ธ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ธ๋ถ ์คํ ์ด์ง ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ ์ฆ๋ช ์ ํ ๋ฒ ์ ๋ ฅํ๊ณ ์์ ํ๊ฒ ์ ์ฅํด ๋ ธ์ถ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ์ญ์์ค.
IAM ์ญํ : ๋ณด์ ์๊ฒฉ ์ฆ๋ช ๊ณผ ์ก์ธ์ค ํค๋ฅผ ์๋ตํ๊ณ , ๊ทธ ๋์
AWS_ROLE
์ ์ฌ์ฉํ์ฌ ์ญํ ์ ์๋ณํ๊ณ AWS ์ญํ ARN(Amazon Resource Name)์ ์ง์ ํฉ๋๋ค.
Google Cloud Storage
STORAGE_INTEGRATION = integration_name
์ธ๋ถ ํด๋ผ์ฐ๋ ์ ์ฅ์์ ๋ํ ์ธ์ฆ ์ฑ ์์ Snowflake ID ๋ฐ ์ก์ธ์ค ๊ด๋ฆฌ(IAM) ์ํฐํฐ์ ์์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ ์ฅ์ ํตํฉ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ CREATE STORAGE INTEGRATION ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Microsoft Azure
STORAGE_INTEGRATION = integration_name
์ธ๋ถ ํด๋ผ์ฐ๋ ์ ์ฅ์์ ๋ํ ์ธ์ฆ ์ฑ ์์ Snowflake ID ๋ฐ ์ก์ธ์ค ๊ด๋ฆฌ(IAM) ์ํฐํฐ์ ์์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ ์ฅ์ ํตํฉ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ CREATE STORAGE INTEGRATION ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
์ ์ฅ์ ํตํฉ์ ๊ผญ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด ์คํ ์ด์ง๋ฅผ ๋ง๋ค๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ๋ CREDENTIALS ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ฐ๋ ์ ์ฅ์ ์๊ฒฉ ์ฆ๋ช ์ ์ ๊ณตํ ํ์๊ฐ ์์ต๋๋ค.
CREDENTIALS = ( AZURE_SAS_TOKEN = 'string' )
Azure์ ์ฐ๊ฒฐํ๊ณ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ํ์ผ์ ์คํ ์ด์งํ๋ ๊ฐ์ธ/๋ณดํธ๋ ์ปจํ ์ด๋์ ์ก์ธ์คํ๊ธฐ ์ํด SAS(๊ณต์ ์ก์ธ์ค ์๋ช ) ํ ํฐ์ ์ง์ ํฉ๋๋ค. ์๊ฒฉ ์ฆ๋ช ์ Azure์์ ์์ฑ๋ฉ๋๋ค.
ENCRYPTION = ( cloud_specific_encryption )
์ ๋ํน COPY ๋ฌธ(๋ช ๋ช ๋ ์ธ๋ถ ์คํ ์ด์ง๋ฅผ ์ฐธ์กฐํ์ง ์๋ ๋ฌธ)์ ์ฌ์ฉํฉ๋๋ค. ์ํธํ๋ ํ์ผ์์ ๋ก๋ฉํ๋ ๊ฒฝ์ฐ์๋ง ํ์ํ๋ฉฐ, ํ์ผ์ด ์ํธํ๋์ง ์์ ๊ฒฝ์ฐ์๋ ํ์ํ์ง ์์ต๋๋ค. ์ ์ฅ์ ์์น์์ ์ํธํ๋ ํ์ผ์ ์ํธ๋ฅผ ํด๋ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ํธํ ์ค์ ์ ์ง์ ํฉ๋๋ค.
Amazon S3
ENCRYPTION = ( [ TYPE = 'AWS_CSE' ] [ MASTER_KEY = '<string>' ] | [ TYPE = 'AWS_SSE_S3' ] | [ TYPE = 'AWS_SSE_KMS' [ KMS_KEY_ID = '<string>' ] ] | [ TYPE = 'NONE' ] )
TYPE = ...
์ฌ์ฉ๋๋ ์ํธํ ์ ํ์ ์ง์ ํฉ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
AWS_CSE
: ํด๋ผ์ด์ธํธ ์ธก ์ํธํ(MASTER_KEY
๊ฐ ํ์). ํ์ฌ, ์ฌ์ฉ์๊ฐ ์ ๊ณตํ๋ ํด๋ผ์ด์ธํธ ์ธก ๋ง์คํฐ ํค ๋ ๋์นญ ํค๋ง ๋ ์ ์์ต๋๋ค.MASTER_KEY
๊ฐ์ ์ ๊ณตํ๋ฉด Snowflake๋TYPE = AWS_CSE
๋ก ๊ฐ์ฃผํฉ๋๋ค(์ฆ,MASTER_KEY
๊ฐ์ ์ ๊ณตํ ๋TYPE
์ด ํ์ํ์ง ์์).AWS_SSE_S3
: ์ถ๊ฐ ์ํธํ ์ค์ ์ด ํ์ ์๋ ์๋ฒ ์ธก ์ํธํ์ ๋๋ค.AWS_SSE_KMS
: ์ ํ์ KMS_KEY_ID
๊ฐ์ ํ์ฉํ๋ ์๋ฒ ์ธก ์ํธํ์ ๋๋ค.NONE
: ์ํธํ๊ฐ ์์ต๋๋ค.
์ํธํ ์ ํ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํด๋ผ์ด์ธํธ ์ธก ์ํธํ ๋๋ ์๋ฒ ์ธก ์ํธํ ์ ๋ํ AWS ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
MASTER_KEY = 'string'
(AWS_CSE
์ํธํ์๋ง ์ ์ฉ)๋ฒํท์ ํ์ผ์ ์ํธํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํด๋ผ์ด์ธํธ ์ธก ๋ง์คํฐ ํค๋ฅผ ์ง์ ํฉ๋๋ค. ๋ง์คํฐ ํค๋ Base64 ์ธ์ฝ๋ฉ ํ์์ 128๋นํธ ๋๋ 256๋นํธ ํค์ฌ์ผ ํฉ๋๋ค.
KMS_KEY_ID = 'string'
(AWS_SSE_KMS
์ํธํ์๋ง ์ ์ฉ)๋ฒํท์ผ๋ก ์ธ๋ก๋ฉ๋ ํ์ผ์ ์ํธํํ๋ ๋ฐ ์ฌ์ฉ๋๋ AWS KMS ๊ด๋ฆฌ ํค์ ID๋ฅผ ์ ํ์ ์ผ๋ก ์ง์ ํฉ๋๋ค. ์๋ฌด๋ฐ ๊ฐ๋ ์ ๋ ฅํ์ง ์์ผ๋ฉด ์ธ๋ก๋ฉ ์ ๊ธฐ๋ณธ KMS ํค ID๋ฅผ ์ฌ์ฉํด ํ์ผ์ ์ํธํํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ๋๋ ์ด ๊ฐ์ ๋ฌด์ํฉ๋๋ค.
Google Cloud Storage
ENCRYPTION = ( [ TYPE = 'GCS_SSE_KMS' | 'NONE' ] [ KMS_KEY_ID = 'string' ] )
TYPE = ...
์ฌ์ฉ๋๋ ์ํธํ ์ ํ์ ์ง์ ํฉ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
GCS_SSE_KMS
: ์ ํ์ KMS_KEY_ID
๊ฐ์ ํ์ฉํ๋ ์๋ฒ ์ธก ์ํธํ์ ๋๋ค.์์ธํ ๋ด์ฉ์ Google Cloud ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
NONE
: ์ํธํ๊ฐ ์์ต๋๋ค.
KMS_KEY_ID = 'string'
(GCS_SSE_KMS
์ํธํ์๋ง ์ ์ฉ)๋ฒํท์ผ๋ก ์ธ๋ก๋ฉ๋ ํ์ผ์ ์ํธํํ๋ ๋ฐ ์ฌ์ฉ๋๋ Cloud KMS ๊ด๋ฆฌ ํค์ ID๋ฅผ ์ ํ์ ์ผ๋ก ์ง์ ํฉ๋๋ค. ์๋ฌด๋ฐ ๊ฐ๋ ์ ๋ ฅํ์ง ์์ผ๋ฉด ์ธ๋ก๋ฉ ์ ๋ฒํท์ ๋ํด ์ค์ ๋ ๊ธฐ๋ณธ KMS ํค ID๋ฅผ ์ฌ์ฉํด ํ์ผ์ ์ํธํํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ๋๋ ์ด ๊ฐ์ ๋ฌด์ํฉ๋๋ค. ์๋น์ค ๊ณ์ ์ด ๋ฒํท์ ์๋ ๋ฐ์ดํฐ์ ์ํธ๋ฅผ ํด๋ ํ๋ ๋ฐ ์ถฉ๋ถํ ๊ถํ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ก๋ฉ ์์ ์ ์ฑ๊ณตํ ๊ฒ์ ๋๋ค.
Microsoft Azure
ENCRYPTION = ( [ TYPE = 'AZURE_CSE' | 'NONE' ] [ MASTER_KEY = 'string' ] )
TYPE = ...
์ฌ์ฉ๋๋ ์ํธํ ์ ํ์ ์ง์ ํฉ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
AZURE_CSE
: ํด๋ผ์ด์ธํธ ์ธก ์ํธํ(MASTER_KEY ๊ฐ ํ์). ์์ธํ ๋ด์ฉ์ Microsoft Azure ์ค๋ช ์์์ ํด๋ผ์ด์ธํธ ์ธก ์ํธํ ์ ๋ณด ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.NONE
: ์ํธํ๊ฐ ์์ต๋๋ค.
MASTER_KEY = 'string'
(AZURE_CSE ์ํธํ์๋ง ์ ์ฉ)ํ์ผ์ ์ํธ ํด๋ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํด๋ผ์ด์ธํธ ์ธก ๋ง์คํฐ ํค๋ฅผ ์ง์ ํฉ๋๋ค. ๋ง์คํฐ ํค๋ Base64 ์ธ์ฝ๋ฉ ํ์์ 128๋นํธ ๋๋ 256๋นํธ ํค์ฌ์ผ ํฉ๋๋ค.
๋ณํ ๋งค๊ฐ ๋ณ์ยถ
( SELECT [alias.]$file_col_num[.element] [ , [alias.]$file_col_num[.element] ... ] FROM ... [ alias ] )
๋ก๋ฉ ์ค ๋ฐ์ดํฐ ๋ณํ์ ํ์ํจ
์คํ ์ด์ง ์ํ ๋ฐ์ดํฐ ํ์ผ์์ ๋ก๋ฉํ ๋ช ์์ ํ๋/์ด ์ธํธ(์ผํ๋ก ๊ตฌ๋ถ)๋ฅผ ์ง์ ํฉ๋๋ค. ํ๋/์ด์ ํ์ค SQL ์ฟผ๋ฆฌ(์ฆ, SELECT ๋ชฉ๋ก)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์์ ์ ํ๋๋ฉฐ, ๋ค์ ์ฌํญ์ ์ฐธ์กฐํ์ญ์์ค.
alias
FROM
๊ฐ์ ์ ํ์ ๋ณ์นญ์ ์ง์ ํฉ๋๋ค(์:COPY INTO t1 (c1) FROM (SELECT d.$1 FROM @mystage/file1.csv.gz d);
์d
).file_col_num
๋ก๋ฉํ ๋ฐ์ดํฐ๊ฐ ์๋ (ํ์ผ ๋ด) ํ๋/์ด์ ์์น ๋ฒํธ๋ฅผ ์ง์ ํฉ๋๋ค(์ฒซ ๋ฒ์งธ ํ๋๋
1
, ๋ ๋ฒ์งธ ํ๋๋2
๋ฑ).element
๋ฐ์ดํฐ ํ์ผ์์ ๋ฐ๋ณต๋๋ ๊ฐ์ ๊ฒฝ๋ก ๋ฐ ์์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค(๋ฐ์ ํ ๋ฐ์ดํฐ ํ์ผ ์๋ง ์ ์ฉ๋จ).
SELECT ๋ชฉ๋ก์ ๋ก๋ฉํ๋ ์๋ณธ ๋ฐ์ดํฐ ํ์ผ์์ ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง ํ๋/์ด ์ธํธ๋ฅผ ์ ์ํฉ๋๋ค. ์ด ๋ชฉ๋ก์ ๋์ ํ ์ด๋ธ์ ์ด ์ํ์ค์ ์ผ์นํด์ผ ํฉ๋๋ค. ์ ํ์
( col_name [ , col_name ... ] )
๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชฉ๋ก์ ๋์ ํ ์ด๋ธ์ ํน์ ์ด์ ๋งคํํ ์ ์์ต๋๋ค.๋ฐ์ดํฐ ํ์ผ์ ์ค์ ํ๋/์ด ์์๋ ๋์ ํ ์ด๋ธ์ ์ด ์์์ ๋ค๋ฅผ ์ ์์ต๋๋ค. SELECT ๋ชฉ๋ก์ด ๋ฐ์ดํฐ ํ์ผ์ ํ๋/์ด์ ํ ์ด๋ธ์ ํด๋น ์ด์ ๋งคํํ๋ ๊ฒ๋ง ์ค์ํฉ๋๋ค.
์ฐธ๊ณ
๋ณํ์ ์ฌ์ฉ๋๋ SELECT ๋ฌธ์ด ๋ชจ๋ ํจ์๋ฅผ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค. ์ง์๋๋ ํจ์์ ์ ์ฒด ๋ชฉ๋ก๊ณผ ์๋ฅผ ํฌํจํ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ณํ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ก๋ ์ค ๋ฐ์ดํฐ ๋ณํํ๊ธฐ ์ ์ฌ์ฉ๋ฒ ๋ ธํธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ํ, ๋ฐ์ดํฐ ๋ก๋ฉ ๋ณํ์ ์ค์ง ์ฌ์ฉ์ ์คํ ์ด์ง ๋ฐ ๋ช ๋ช ๋ ์คํ ์ด์ง(๋ด๋ถ ๋๋ ์ธ๋ถ)์์์ ๋ฐ์ดํฐ ์ ํ๋ง ์ง์ํฉ๋๋ค.
( col_name [ , col_name ... ] )
์ ํ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ํ ์ด๋ธ ์ด(์ผํ๋ก ๊ตฌ๋ถ)์ ๋ช ์์ ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์ด์ ๋ก๋ฉ๋ ํ์ผ์์ ์ถ์ถ๋ ์ฒซ ๋ฒ์งธ ํ๋/์ด์์ ์์ฑ๋ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
๋ ๋ฒ์งธ ์ด์ ๋ก๋ฉ๋ ํ์ผ์์ ์ถ์ถ๋ ๋ ๋ฒ์งธ ํ๋/์ด์์ ์์ฑ๋ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฐ ์์ผ๋ก ์ง์ ๋ ์์๋๋ก ์ฌ์ฉํฉ๋๋ค.
์ด ๋ชฉ๋ก์์ ์ด์ ๋ฐ๋ณตํ ์ ์์ต๋๋ค. ์ด ์ด ๋ชฉ๋ก์์ ์ ์ธ๋ ์ด์ ๋ชจ๋ ๊ธฐ๋ณธ๊ฐ(์ง์ ๋์ง ์์ ๊ฒฝ์ฐ NULL)์ผ๋ก ์ฑ์์ง๋๋ค. ํ์ง๋ง ์ ์ธ๋ ์ด์ ์ํ์ค๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ์ง ์ ์์ต๋๋ค.
์ ํ์ ๋งค๊ฐ ๋ณ์ยถ
FILES = ( 'file_name' [ , 'file_name' ... ] )
๋ก๋ฉํ ํ๋ ์ด์์ ํ์ผ ์ด๋ฆ(์ผํ๋ก ๊ตฌ๋ถ)์ผ๋ก ๊ตฌ์ฑ๋ ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค. Snowflake ๋ด๋ถ ์์น๋ ๋ช ๋ น์ ์ง์ ๋ ์ธ๋ถ ์์น์ ํ์ผ์ด ์ด๋ฏธ ์คํ ์ด์ง๋์ด ์์ด์ผ ํฉ๋๋ค. ์ง์ ๋ ํ์ผ์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ COPY ๋ฌธ์ ๋ค๋ฅธ
ON_ERROR
์ต์ ์ ๋ช ์์ ์ผ๋ก ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๋์ON_ERROR = ABORT_STATEMENT
๊ฐ ๋ก๋ฉ ์์ ์ ์ค๋จํฉ๋๋ค.์ง์ ํ ์ ์๋ ํ์ผ ์ด๋ฆ์ ์ต๋ ๊ฐ์๋ 1,000๊ฐ์ ๋๋ค.
์ฐธ๊ณ
์ธ๋ถ ์คํ ์ด์ง(Amazon S3, Google Cloud Storage ๋๋ Microsoft Azure)์ ๊ฒฝ์ฐ์๋ง ํ์ผ ๊ฒฝ๋ก๊ฐ ์คํ ์ด์ง ์ ์์ URL๊ณผ ํ์ธ๋ ํ์ผ ์ด๋ฆ์ ๋ชฉ๋ก์ ์ฐ๊ฒฐํ์ฌ ์ค์ ๋ฉ๋๋ค.
ํ์ง๋ง Snowflake๋ ๊ฒฝ๋ก์ ํ์ผ ์ด๋ฆ ์ฌ์ด์ ์์์ ์ผ๋ก ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ์ฝ์ ํ์ง ์์ต๋๋ค. ์คํ ์ด์ง ์ ์์์ URL์ ๋ ๋ถ๋ถ์ด๋ ์ด ๋งค๊ฐ ๋ณ์์ ์ง์ ๋ ๊ฐ ํ์ผ ์ด๋ฆ์ ์์ ๋ถ๋ถ์ ๊ตฌ๋ถ ๊ธฐํธ(
/
)๋ฅผ ๋ช ์์ ์ผ๋ก ํฌํจํด์ผ ํฉ๋๋ค.PATTERN = 'regex_pattern'
์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ์ ๊ท์ ํจํด ๋ฌธ์์ด๋ก, ์ผ์น์ํฌ ํ์ผ ์ด๋ฆ ๋ฐ/๋๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค.
ํ
์ต์์ ์ฑ๋ฅ์ ์ํด์๋ ๋ง์ ์์ ํ์ผ์ ํํฐ๋งํ๋ ํจํด์ ์ ์ฉํ์ง ๋ง์ญ์์ค.
์ ๊ท์์ ๋๋ ๋ฐ์ดํฐ ๋ก๋ฉ๊ณผ Snowpipe ๋ฐ์ดํฐ ๋ก๋ฉ์ ์๋ก ๋ค๋ฅด๊ฒ ์ ์ฉ๋จ์ ์ ์ํ์ญ์์ค.
Snowpipe๋ ์ ์ฅ์ ์์น์์ ์คํ ์ด์ง ์ ์์ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ฅผ ๋ชจ๋ ์๋ฅด๊ณ ๋๋จธ์ง ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ์ ํ์ผ ์ด๋ฆ์ ์ ๊ท์์ ์ ์ฉํฉ๋๋ค. ์คํ ์ด์ง ์ ์๋ฅผ ๋ณด๋ ค๋ฉด ์คํ ์ด์ง์ ๋ํด DESCRIBE STAGE ๋ช ๋ น์ ์คํํ์ญ์์ค. URL ์์ฑ์ ๋ฒํท ๋๋ ์ปจํ ์ด๋ ์ด๋ฆ๊ณผ 0๊ฐ ๋๋ ๊ทธ ์ด์์ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด COPY INTO <ํ ์ด๋ธ> ๋ฌธ์์ FROM ์์น๊ฐ
@s/path1/path2/
์ด๊ณ ์คํ ์ด์ง@s
์ URL ๊ฐ์ดs3://mybucket/path1/
์ธ ๊ฒฝ์ฐ, Snowpipe๋ FROM ์ ์ ์ ์ฅ์ ์์น์์/path1/
์ ์๋ฅด๊ณ ๊ฒฝ๋ก์์path2/
์ ํ์ผ ์ด๋ฆ์ ์ ๊ท์์ ์ ์ฉํฉ๋๋ค.๋๋ ๋ฐ์ดํฐ ๋ก๋ฉ ์์ ์ ์ ๊ท์์ FROM ์ ์ ์ ์ฒด ์ ์ฅ์ ์์น์ ์ ์ฉํฉ๋๋ค.
์ฐธ๊ณ
FILES
๋ฐPATTERN
์ต์ ์ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐFILES
์ต์ ์ ์ง์ ๋ ๊ฒฝ๋ก๋ง ๋ก๋๋ฉ๋๋ค. ์ด ๋ ๊ฐ์ง ์ต์ ์ ํจ๊ป ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.FILE_FORMAT = ( FORMAT_NAME = 'file_format_name' )
๋๋ .FILE_FORMAT = ( TYPE = CSV | JSON | AVRO | ORC | PARQUET | XML [ ... ] )
๋ค์๊ณผ ๊ฐ์ด ๋ก๋ฉํ ๋ฐ์ดํฐ ํ์ผ์ ํ์์ ์ง์ ํฉ๋๋ค.
FORMAT_NAME = 'file_format_name'
๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ๋ก ๋ก๋ฉํ๋ ๋ฐ ์ฌ์ฉํ ๊ธฐ์กด์ ๋ช ๋ช ๋ ํ์ผ ํ์์ ์ง์ ํฉ๋๋ค. ๋ช ๋ช ๋ ํ์ผ ํ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ ํ์ผ์ ํ์ ์ ํ(CSV, JSON ๋ฑ)๋ฟ ์๋๋ผ, ๊ธฐํ ํ์ ์ต์ ๋ ๋ชจ๋ ๊ฒฐ์ ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ CREATE FILE FORMAT ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
TYPE = CSV | JSON | AVRO | ORC | PARQUET | XML [ ... ]
ํ ์ด๋ธ๋ก ๋ก๋ฉํ ํ์ผ์ ํ์์ ์ง์ ํฉ๋๋ค. ํ์ ์ ํ์ ์ง์ ํ๋ฉด ํ์๋ณ ์ต์ ์ ์ถ๊ฐ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ํญ๋ชฉ์ ์๋ ํ์ ์ ํ ์ต์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
FORMAT_NAME
๋ฐTYPE
์ ์ํธ ๋ฐฐํ์ ์ธ๋ฐ, ๊ฐ์ COPY ๋ช ๋ น์์ ๋ ๋ค ์ง์ ํ๋ฉด ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.COPY_OPTIONS = ( ... )
๋ก๋ฉ๋ ๋ฐ์ดํฐ์ ๋ํด ํ๋ ์ด์์ ๋ณต์ฌ ์ต์ ์ ์ง์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ํญ๋ชฉ์ ์๋ ๋ณต์ฌ ์ต์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
VALIDATION_MODE = RETURN_n_ROWS | RETURN_ERRORS | RETURN_ALL_ERRORS
๋ฐ์ดํฐ ํ์ผ์ ์ง์ ๋ ํ ์ด๋ธ์ ๋ก๋ฉํ๋ ๋์ COPY ๋ช ๋ น์ ๋ฐ์ดํฐ ํ์ผ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋๋ก ์ง์ํ๋ ๋ฌธ์์ด(์์)์ ๋๋ค. ์ฆ, COPY ๋ช ๋ น์ ํ์ผ์ ์ค๋ฅ๊ฐ ์๋์ง ํ ์คํธํ๋, ํ์ผ์ ๋ก๋ฉํ์ง๋ ์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ก๋ฉํ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ณ ์ง์ ๋ ์ ํจ์ฑ ๊ฒ์ฌ ์ต์ ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
์ง์๋๋ ๊ฐ
์ฐธ๊ณ
RETURN_n_ROWS
(์:RETURN_10_ROWS
)์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ์ง์ ๋ ์์ ํ์ ๊ฒ์ฆํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์์ ์ฒ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ์คํจํฉ๋๋ค.
RETURN_ERRORS
COPY ๋ฌธ์ ์ง์ ๋ ๋ชจ๋ ํ์ผ์์ ๋ชจ๋ ์ค๋ฅ(๊ตฌ๋ฌธ ๋ถ์, ๋ณํ ๋ฑ)๋ฅผ ๋ฐํํฉ๋๋ค.
RETURN_ALL_ERRORS
ON_ERROR
๋ณต์ฌ ์ต์ ์ด ๋ก๋ฉ ์ค์CONTINUE
๋ก ์ค์ ๋์์ผ๋ฏ๋ก ์ด์ ์ ๋ก๋ฉ ์ค์ ๋ถ๋ถ์ ์ผ๋ก ๋ก๋ฉ๋ ์ค๋ฅ๊ฐ ์๋ ํ์ผ์ ํฌํจํ์ฌ COPY ๋ฌธ์ ์ง์ ๋ ๋ชจ๋ ํ์ผ์์ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.์ฐธ๊ณ
VALIDATION_MODE
๋ ๋ก๋ฉ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ COPY ๋ฌธ์ ์ง์ํ์ง ์์ต๋๋ค. ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ๋ฉด COPY ๋ฌธ์ด ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.VALIDATION_MODE
๋ Snowflake ๊ด๋ฆฌ ํ ์ด๋ธ์LOAD_MODE
๋ณต์ฌ๋ณธ ์ ํ ์ฌํญ์ ์ฌ์ฉํ ๋ ์ง์๋์ง ์์ต๋๋ค.์ด์ ๋ก๋ฉ ์ค์ ๋ฐ์ํ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ณด๋ ค๋ฉด VALIDATE ํ ์ด๋ธ ํจ์๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๋ํ, ์ด ํจ์๋ ๋ก๋ฉ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ COPY ๋ฌธ์ ์ง์ํ์ง ์์ต๋๋ค.
ํ์ ์ ํ ์ต์
(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
๋ก๋ฉํ ๋ฐ์ดํฐ ํ์ผ์ด ์์ถ๋์ง ์์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
AUTO
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
PARSE_HEADER = TRUE | FALSE
์ด ์ด๋ฆ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ฐ์ดํฐ ํ์ผ์ ์ฒซ ๋ฒ์งธ ํ ๋จธ๋ฆฌ๊ธ์ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
์ด ํ์ผ ํ์ ์ต์ ์ ๋ค์ ์์ ์๋ง ์ ์ฉ๋ฉ๋๋ค.
INFER_SCHEMA ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ ์๋ฅผ ์๋์ผ๋ก ๊ฐ์ง.
INFER_SCHEMA ํจ์ ๋ฐ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ CSV ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ณ ์ด์ ๋ก๋.
์ด ์ต์ ์ TRUE๋ก ์ค์ ํ๋ฉด ์ฒซ ๋ฒ์งธ ํ ๋จธ๋ฆฌ๊ธ์ ์ฌ์ฉํด ์ด ์ด๋ฆ์ ๊ฒฐ์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ FALSE๋ก ๊ทธ๋๋ก ๋๋ฉด ์ด ์ด๋ฆ์ด c ๋ก ๋ฐํ๋๋ฉฐ ์ฌ๊ธฐ์ ๋ ์ด์ ์์น์ ๋๋ค.
PARSE_HEADER = TRUE์ธ ๊ฒฝ์ฐ SKIP_HEADER ์ต์ ์ ์ง์๋์ง ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
SKIP_HEADER = integer
ํ์ผ ์์์์ ๊ฑด๋๋ธ ์ค์ ๊ฐ์์ ๋๋ค.
์ฐธ๊ณ ๋ก, SKIP_HEADER๋ ํค๋ ์ค์ด ๋ฌด์์ธ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด RECORD_DELIMITER ๋๋ FIELD_DELIMITER ๊ฐ์ ์ฌ์ฉํ์ง๋ ์์ผ๋ฉฐ, ์คํ๋ ค ํ์ผ์์ ์ง์ ๋ ์๋งํผ CRLF(์บ๋ฆฌ์ง ๋ฆฌํด, ์ค ๋ฐ๊ฟ)๋ก ๊ตฌ๋ถ๋ ์ค์ ๊ฑด๋๋๋๋ค. ๊ทธ๋ฐ ๋ค์ RECORD_DELIMITER์ FIELD_DELIMITER๋ฅผ ์ฌ์ฉํด ๋ก๋ฉํ ๋ฐ์ดํฐ ํ์ ๊ฒฐ์ ํฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
0
SKIP_BLANK_LINES = TRUE | FALSE
- ์ฉ๋:
๋ฐ์ดํฐ ๋ก๋ฉ ์ ์ฉ
- ์ ์:
๋ฐ์ดํฐ ํ์ผ์์ ๋ฐ๊ฒฌ๋๋ ๋น ์ค์ ๊ฑด๋๋ฐ๋๋ก ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋น ์ค๋ก ์ธํด ๋ ์ฝ๋ ๋ ์ค๋ฅ๋ฅผ ๋ฐ์ํฉ๋๋ค(๊ธฐ๋ณธ ๋์).
- ๊ธฐ๋ณธ๊ฐ:
FALSE
DATE_FORMAT = 'string' | AUTO
๋ก๋ฉํ ๋ฐ์ดํฐ ํ์ผ์ ๋ ์ง ๊ฐ ํ์์ ์ ์ํ๋ ๋ฌธ์์ด์ ๋๋ค. ๊ฐ์ด ์ง์ ๋์ง ์๊ฑฐ๋
AUTO
์ธ ๊ฒฝ์ฐ DATE_INPUT_FORMAT ์ธ์ ๋งค๊ฐ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
AUTO
TIME_FORMAT = 'string' | AUTO
๋ก๋ฉํ ๋ฐ์ดํฐ ํ์ผ์ ์๊ฐ ๊ฐ ํ์์ ์ ์ํ๋ ๋ฌธ์์ด์ ๋๋ค. ๊ฐ์ด ์ง์ ๋์ง ์๊ฑฐ๋
AUTO
์ธ ๊ฒฝ์ฐ TIME_INPUT_FORMAT ์ธ์ ๋งค๊ฐ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
AUTO
TIMESTAMP_FORMAT = 'string' | AUTO
๋ก๋ฉํ ๋ฐ์ดํฐ ํ์ผ์ ํ์์คํฌํ ๊ฐ ํ์์ ์ ์ํ๋ ๋ฌธ์์ด์ ๋๋ค. ๊ฐ์ด ์ง์ ๋์ง ์๊ฑฐ๋
AUTO
์ธ ๊ฒฝ์ฐ TIMESTAMP_INPUT_FORMAT ์ธ์ ๋งค๊ฐ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
AUTO
BINARY_FORMAT = HEX | BASE64 | UTF8
์ด์ง ์ ๋ ฅ ๋๋ ์ถ๋ ฅ์ ์ธ์ฝ๋ฉ ํ์์ ์ ์ํ๋ ๋ฌธ์์ด(์์)์ ๋๋ค. ์ด ์ต์ ์ ํ ์ด๋ธ์ ์ด์ง ์ด๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ๋๋ง ์ ์ฉ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
HEX
ESCAPE = 'character' | NONE
- ์ฉ๋:
๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ์ธ๋ก๋ฉ
- ์ ์:
๊ดํธ๋ก ๋ฌถ์ธ ํ๋ ๊ฐ์ ๋ํด์๋ง ์ด์ค์ผ์ดํ ๋ฌธ์๋ก ์ฌ์ฉ๋๋ ์ฑ๊ธ๋ฐ์ดํธ ๋ฌธ์์ ๋๋ค. ์ด์ค์ผ์ดํ ๋ฌธ์๋ ๋ฌธ์ ์ํ์ค์ ํ์ ๋ฌธ์์ ๋ํ ๋์ฒด ํด์์ ํธ์ถํฉ๋๋ค. ESCAPE ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์๋
FIELD_OPTIONALLY_ENCLOSED_BY
๋ฌธ์์ ์ธ์คํด์ค๋ฅผ ๋ฆฌํฐ๋ด๋ก ํด์ํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ด์ค์ผ์ดํ ์ํ์ค(์: ํญ์
\t
, ์ ์ค์\n
, ์บ๋ฆฌ์ง ๋ฆฌํด์\r
, ๋ฐฑ์ฌ๋์๋\\
), 8์ง์ ๊ฐ ๋๋ 16์ง์ ๊ฐ์ ์๋ฝํฉ๋๋ค.์ฐธ๊ณ
์ด ํ์ผ ํ์ ์ต์ ์ ์ฑ๊ธ๋ฐ์ดํธ ๋ฌธ์๋ง ์ง์ํฉ๋๋ค. UTF-8 ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์์ ASCII ๋ฌธ์๋ฅผ ๋ฉํฐ๋ฐ์ดํธ ๋ฌธ์๋ก ๋ํ๋ ๋๋ค. ๋ฐ์ดํฐ ํ์ผ์ด UTF-8 ๋ฌธ์ ์ธํธ๋ก ์ธ์ฝ๋ฉ๋ ๊ฒฝ์ฐ ์์ ASCII ๋ฌธ์๋ฅผ ์ต์ ๊ฐ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
๋ํ ์์ ASCII ๋ฌธ์๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ
ENCODING = 'string'
ํ์ผ ํ์ ์ต์ ์ ๋ฐ์ดํฐ ํ์ผ์ ๋ฌธ์ ์ธ์ฝ๋ฉ์ผ๋ก ์ค์ ํ์ฌ ๋ฌธ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํด์๋๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ด ์ข์ต๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
NONE
ESCAPE_UNENCLOSED_FIELD = 'character' | NONE
- ์ฉ๋:
๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ์ธ๋ก๋ฉ
- ์ ์:
๊ดํธ๋ก ๋ฌถ์ด์ง ์์ ํ๋ ๊ฐ์ ๋ํด์๋ง ์ด์ค์ผ์ดํ ๋ฌธ์๋ก ์ฌ์ฉ๋๋ ์ฑ๊ธ๋ฐ์ดํธ ๋ฌธ์์ ๋๋ค. ์ด์ค์ผ์ดํ ๋ฌธ์๋ ๋ฌธ์ ์ํ์ค์ ํ์ ๋ฌธ์์ ๋ํ ๋์ฒด ํด์์ ํธ์ถํฉ๋๋ค. ESCAPE ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์๋
FIELD_DELIMITER
๋๋RECORD_DELIMITER
๋ฌธ์์ ์ธ์คํด์ค๋ฅผ ๋ฆฌํฐ๋ด๋ก ํด์ํ ์ ์์ต๋๋ค. ์ด์ค์ผ์ดํ ๋ฌธ์๋ ๋ฐ์ดํฐ์์ ์์ ์ ์ธ์คํด์ค๋ฅผ ์ด์ค์ผ์ดํํ๋ ๋ฐ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ด์ค์ผ์ดํ ์ํ์ค(์: ํญ์
\t
, ์ ์ค์\n
, ์บ๋ฆฌ์ง ๋ฆฌํด์\r
, ๋ฐฑ์ฌ๋์๋\\
), 8์ง์ ๊ฐ ๋๋ 16์ง์ ๊ฐ์ ์๋ฝํฉ๋๋ค.์ฐธ๊ณ
๊ธฐ๋ณธ๊ฐ์
\\
์ ๋๋ค. ๋ฐ์ดํฐ ํ์ผ์ ํ์ด ๋ฐฑ์ฌ๋์(\
) ๋ฌธ์๋ก ๋๋ ๊ฒฝ์ฐ ์ด ๋ฌธ์๋RECORD_DELIMITER
ํ์ผ ํ์ ์ต์ ์ ๋ํด ์ง์ ๋ ์ค ๋ฐ๊ฟ ๋๋ ์บ๋ฆฌ์ง ๋ฆฌํด ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ๋ก๋ฉ ์์ ์์ ์ด ํ๊ณผ ๋ค์ ํ์ ๋จ์ผ ๋ฐ์ดํฐ ํ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๊ฐ์NONE
์ผ๋ก ์ค์ ํ์ญ์์ค.์ด ํ์ผ ํ์ ์ต์ ์ ์ฑ๊ธ๋ฐ์ดํธ ๋ฌธ์๋ง ์ง์ํฉ๋๋ค. UTF-8 ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์์ ASCII ๋ฌธ์๋ฅผ ๋ฉํฐ๋ฐ์ดํธ ๋ฌธ์๋ก ๋ํ๋ ๋๋ค. ๋ฐ์ดํฐ ํ์ผ์ด UTF-8 ๋ฌธ์ ์ธํธ๋ก ์ธ์ฝ๋ฉ๋ ๊ฒฝ์ฐ ์์ ASCII ๋ฌธ์๋ฅผ ์ต์ ๊ฐ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
๋ํ ์์ ASCII ๋ฌธ์๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ
ENCODING = 'string'
ํ์ผ ํ์ ์ต์ ์ ๋ฐ์ดํฐ ํ์ผ์ ๋ฌธ์ ์ธ์ฝ๋ฉ์ผ๋ก ์ค์ ํ์ฌ ๋ฌธ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํด์๋๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
๋ฐฑ์ฌ๋์(
\\
)
TRIM_SPACE = TRUE | FALSE
ํ๋์์ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํํธ์จ์ด์์ ํ๋๋ฅผ ๋ฐ์ดํ๋ก ๋ฌถ๊ณ ์ ํ ๊ณต๋ฐฑ์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ Snowflake๋ ์ฒซ ๋ฐ์ดํ ๋ฌธ์๊ฐ ์๋ ์ ํ ๊ณต๋ฐฑ์ ํ๋์ ์์ ๋ถ๋ถ์ผ๋ก ์ฝ์ต๋๋ค(์ฆ, ๋ฐ์ดํ๋ ํ๋ ๋ฐ์ดํฐ ๋ฌธ์์ด์ ์ผ๋ถ๋ก ํด์). ๋ฐ์ดํฐ ๋ก๋ฉ ์ค์ ๋ถํ์ํ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ ค๋ฉด ์ด ์ต์ ์ ์ฌ์ฉํ์ญ์์ค.
๋ ๋ค๋ฅธ ์๋ก, ์ ํ ๋๋ ํํ ๊ณต๋ฐฑ์ด ๋ฌธ์์ด์ ๋ฌถ๋ ๋ฐ์ดํ ์ฃผ์์ ์๋ ๊ฒฝ์ฐ
TRIM_SPACE
์ต์ ์ ์ฌ์ฉํ์ฌ ์ฃผ์์ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๊ณFIELD_OPTIONALLY_ENCLOSED_BY
์ต์ ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋ฐ์ดํ ์์ ๋ชจ๋ ๊ณต๋ฐฑ์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.์๋ฅผ ๋ค์ด, ํ๋ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ
|
๋ฐFIELD_OPTIONALLY_ENCLOSED_BY = '"'
๋ผ๊ณ ๊ฐ์ ํ๋ฉด ๋ค์ ํญ๋ชฉ์ด|"Hello world"| |" Hello world "| | "Hello world" |
์๋์ ๊ฐ์ด ๋ฉ๋๋ค.
+---------------+ | C1 | |----+----------| | Hello world | | Hello world | | 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
(์ฆ,ESCAPE_UNENCLOSED_FIELD
๊ฐ์ด\\
(๊ธฐ๋ณธ๊ฐ)๋ผ๊ณ ๊ฐ์ ํ๋ NULL)
ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE | FALSE
์ ๋ ฅ ๋ฐ์ดํฐ ํ์ผ์ ๊ตฌ๋ถ๋ ์ด(์ฆ, ํ๋) ์๊ฐ ํด๋น ํ ์ด๋ธ์ ์ด ์์ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ๋ฅผ ์์ฑํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
FALSE
๋ก ์ค์ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ณ ๋ก๋ฉ์ด ๊ณ์๋ฉ๋๋ค. ํ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ๋ก๋ฉ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.์ ๋ ฅ ํ์ผ์ ํ ์ด๋ธ์ ์ด๋ณด๋ค ๋ง์ ์์ ํ๋๊ฐ ์๋ ๋ ์ฝ๋๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์ผ์นํ๋ ํ๋๋ ํ์ผ์์ ๋์ค๋ ์์๋๋ก ๋ก๋ฉ๋๊ณ ๋๋จธ์ง ํ๋๋ ๋ก๋ฉ๋์ง ์์ต๋๋ค.
์ ๋ ฅ ํ์ผ์ ํ ์ด๋ธ์ ์ด๋ณด๋ค ์ ์ ์์ ํ๋๊ฐ ์๋ ๋ ์ฝ๋๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ํ ์ด๋ธ์์ ์ผ์นํ์ง ์๋ ์ด์ด NULL ๊ฐ๊ณผ ํจ๊ป ๋ก๋ฉ๋ฉ๋๋ค.
์ด ์ต์ ์์๋ ์ ๋ ฅ ํ์ผ ๋ด์ ๋ชจ๋ ๋ ์ฝ๋๊ฐ ๊ฐ์ ๊ธธ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค(์ฆ, ์ด ์ต์ ์ ๋ํด ์ง์ ๋ ๊ฐ๊ณผ ๊ด๊ณ์์ด ๋ค์ํ ๊ธธ์ด์ ๋ ์ฝ๋๋ฅผ ํฌํจํ ํ์ผ์ด ์ค๋ฅ๋ฅผ ๋ฐํํจ).
- ๊ธฐ๋ณธ๊ฐ:
TRUE
์ฐธ๊ณ
๋ก๋ฉํ๋ ๋์ ๋ฐ์ดํฐ ๋ณํ ์(์ฆ, ์ฟผ๋ฆฌ๋ฅผ COPY INTO <ํ ์ด๋ธ> ๋ช ๋ น์ ์์ค๋ก ์ฌ์ฉ), ์ด ์ต์ ์ ๋ฌด์๋ฉ๋๋ค. ๋ฐ์ดํฐ ํ์ผ์ ์ด ๊ฐ์ ๋ฐ ์์๋ ๋์ ํ ์ด๋ธ๊ณผ ๊ฐ์ง ์์๋ ๋ฉ๋๋ค.
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
์ ํจํ์ง ์์ UTF-8 ๋ฌธ์๋ฅผ ์ ๋์ฝ๋ ๋์ฒด ๋ฌธ์(
๏ฟฝ
)๋ก ๋์ฒดํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ. ๋ณต์ฌ ์ต์ ์ ์ผ๋์ผ ๋ฌธ์ ๋์ฒด๋ฅผ ์ํํฉ๋๋ค.TRUE
๋ก ์ค์ ํ๋ฉด Snowflake๊ฐ ์๋ชป๋ UTF-8 ๋ฌธ์๋ฅผ ์ ๋์ฝ๋ ๋์ฒด ๋ฌธ์๋ก ๋ฐ๊ฟ๋๋ค.FALSE
๋ก ์ค์ ํ๋ฉด ์๋ชป๋ UTF-8 ๋ฌธ์ ์ธ์ฝ๋ฉ์ด ๊ฐ์ง๋ ๋ ๋ก๋ฉ ์์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
FALSE
EMPTY_FIELD_AS_NULL = TRUE | FALSE
๋ ๊ฐ์ ์ฐ์์ ์ธ ๊ตฌ๋ถ ๊ธฐํธ(์:
,,
)๋ก ํ์๋๋ ์ ๋ ฅ ํ์ผ์ ๋น ํ๋์ SQL NULL ์ ์ฝ์ ํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.FALSE
๋ก ์ค์ ํ๋ฉด Snowflake๊ฐ ๋น ํ๋๋ฅผ ํด๋น ์ด ํ์ ์ผ๋ก ์บ์คํ ํ๋ ค๊ณ ์๋ํฉ๋๋ค. STRING ์ ํ์ ์ด์ ๋น ๋ฌธ์์ด์ด ์ฝ์ ๋ฉ๋๋ค. ๋ค๋ฅธ ์ด ์ ํ์ ๊ฒฝ์ฐ COPY INTO <ํ ์ด๋ธ> ๋ช ๋ น์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
TRUE
SKIP_BYTE_ORDER_MARK = TRUE | FALSE
๋ฐ์ดํฐ ํ์ผ์ ์๋ ๊ฒฝ์ฐ BOM(๋ฐ์ดํธ ์์ ํ์)๋ฅผ ๊ฑด๋๋ธ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค. BOM์ ๋ฐ์ดํฐ ํ์ผ์ ์์ ๋ถ๋ถ์์ ๋ฐ์ดํธ ์์์ ์ธ์ฝ๋ฉ ํ์์ ์ ์ํ๋ ๋ฌธ์ ์ฝ๋์ ๋๋ค.
FALSE
๋ก ์ค์ ํ๋ฉด Snowflake๊ฐ ๋ฐ์ดํฐ ํ์ผ์ ์๋ ๋ชจ๋ BOM์ ์ธ์ํ๋ฏ๋ก, BOM์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ํ ์ด๋ธ์ ์ฒซ ๋ฒ์งธ ์ด์ ๋ณํฉ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ ์ ์์ต๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
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๋ก ๋ณํ๋ ํ Snowflake์ ๋ก๋ฉ๋ฉ๋๋ค.
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
DATE_FORMAT = 'string' | AUTO
๋ฐ์ดํฐ ํ์ผ์์ ๋ ์ง ๋ฌธ์์ด ๊ฐ ํ์์ ์ ์ํฉ๋๋ค. ๊ฐ์ด ์ง์ ๋์ง ์๊ฑฐ๋
AUTO
์ธ ๊ฒฝ์ฐ DATE_INPUT_FORMAT ๋งค๊ฐ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.์ด ํ์ผ ํ์ ์ต์ ์ ๋ค์ ์์ ์๋ง ์ ์ฉ๋ฉ๋๋ค.
MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ JSON ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ๋ ์์ .
COPY ๋ฌธ์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ์ฌ ๋ณ๊ฐ์ ์ด์ JSON ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ๋ ์์ (์ฆ, COPY ๋ณํ).
- ๊ธฐ๋ณธ๊ฐ:
AUTO
TIME_FORMAT = 'string' | AUTO
๋ฐ์ดํฐ ํ์ผ์์ ์๊ฐ ๋ฌธ์์ด ๊ฐ ํ์์ ์ ์ํฉ๋๋ค. ๊ฐ์ด ์ง์ ๋์ง ์๊ฑฐ๋
AUTO
์ธ ๊ฒฝ์ฐ TIME_INPUT_FORMAT ๋งค๊ฐ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.์ด ํ์ผ ํ์ ์ต์ ์ ๋ค์ ์์ ์๋ง ์ ์ฉ๋ฉ๋๋ค.
MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ JSON ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ๋ ์์ .
COPY ๋ฌธ์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ์ฌ ๋ณ๊ฐ์ ์ด์ JSON ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ๋ ์์ (์ฆ, COPY ๋ณํ).
- ๊ธฐ๋ณธ๊ฐ:
AUTO
TIMESTAMP_FORMAT = string' | AUTO
๋ฐ์ดํฐ ํ์ผ์์ ํ์์คํฌํ ๋ฌธ์์ด ๊ฐ ํ์์ ์ ์ํฉ๋๋ค. ๊ฐ์ด ์ง์ ๋์ง ์๊ฑฐ๋
AUTO
์ธ ๊ฒฝ์ฐ TIMESTAMP_INPUT_FORMAT ๋งค๊ฐ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.์ด ํ์ผ ํ์ ์ต์ ์ ๋ค์ ์์ ์๋ง ์ ์ฉ๋ฉ๋๋ค.
MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ JSON ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ๋ ์์ .
COPY ๋ฌธ์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ์ฌ ๋ณ๊ฐ์ ์ด์ JSON ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ๋ ์์ (์ฆ, COPY ๋ณํ).
- ๊ธฐ๋ณธ๊ฐ:
AUTO
BINARY_FORMAT = HEX | BASE64 | UTF8
๋ฐ์ดํฐ ํ์ผ์ ์ด์ง ๋ฌธ์์ด ๊ฐ์ ๋ํ ์ธ์ฝ๋ฉ ํ์์ ์ ์ํฉ๋๋ค. ์ด ์ต์ ์ ํ ์ด๋ธ์ ์ด์ง ์ด๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ํ์ผ ํ์ ์ต์ ์ ๋ค์ ์์ ์๋ง ์ ์ฉ๋ฉ๋๋ค.
MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ JSON ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ๋ ์์ .
COPY ๋ฌธ์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ์ฌ ๋ณ๊ฐ์ ์ด์ JSON ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ๋ ์์ (์ฆ, COPY ๋ณํ).
- ๊ธฐ๋ณธ๊ฐ:
HEX
TRIM_SPACE = TRUE | FALSE
๋ฌธ์์ด์์ ์ ํ ๊ณต๋ฐฑ๊ณผ ํํ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํํธ์จ์ด์์ ํ๋๋ฅผ ๋ฐ์ดํ๋ก ๋ฌถ๊ณ ์ ํ ๊ณต๋ฐฑ์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ Snowflake๋ ์ฒซ ๋ฐ์ดํ ๋ฌธ์๊ฐ ์๋ ์ ํ ๊ณต๋ฐฑ์ ํ๋์ ์์ ๋ถ๋ถ์ผ๋ก ์ฝ์ต๋๋ค(์ฆ, ๋ฐ์ดํ๋ ํ๋ ๋ฐ์ดํฐ ๋ฌธ์์ด์ ์ผ๋ถ๋ก ํด์). ๋ฐ์ดํฐ ๋ก๋ฉ ์ค์ ๋ถํ์ํ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ ค๋ฉด ์ด ์ต์ ์
TRUE
๋ก ์ค์ ํ์ญ์์ค.์ด ํ์ผ ํ์ ์ต์ ์ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ JSON ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ ๋๋ง ๋ค์ ์์ ์ ์ ์ฉ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
MULTI_LINE = TRUE | FALSE
์ฌ๋ฌ ์ค ํ์ฉ ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
MULTI_LINE ์ด
FALSE
๋ก ์ค์ ๋์ด ์๊ณ JSON ๋ ์ฝ๋ ๋ด์ ์ ์ค์ด ์๋ ๊ฒฝ์ฐ ์ ์ค์ด ํฌํจ๋ ๋ ์ฝ๋๋ ์ค๋ฅ๋ก ํด์๋ฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
TRUE
NULL_IF = ( 'string1' [ , 'string2' , ... ] )
SQL NULL๋ก ๋ณํํ๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฌธ์์ด์ ๋๋ค. Snowflake๋ ๋ฐ์ดํฐ ๋ก๋ฉ ์์ค์ ์ด๋ฌํ ๋ฌธ์์ด์ SQL NULL๋ก ๋ฐ๊ฟ๋๋ค. ๋ ์ด์์ ๋ฌธ์์ด์ ์ง์ ํ๋ ค๋ฉด ๋ฌธ์์ด ๋ชฉ๋ก์ ๊ดํธ๋ก ๋ฌถ๊ณ ์ผํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ์ ๊ฐ์ ๊ตฌ๋ถํฉ๋๋ค.
์ด ํ์ผ ํ์ ์ต์ ์ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ JSON ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ ๋๋ง ๋ค์ ์์ ์ ์ ์ฉ๋ฉ๋๋ค.
Snowflake๋ ๋ฐ์ดํฐ ํ์ ๊ณผ ๊ด๊ณ์์ด ๊ฐ์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ NULL๋ก ๋ณํํฉ๋๋ค. ์๋ฅผ ๋ค์ด
2
๊ฐ ๊ฐ์ผ๋ก ์ง์ ๋๋ฉด2
์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋ฌธ์์ด ๋๋ ์ซ์๋ก ๋ณํ๋ฉ๋๋ค.์:
NULL_IF = ('\N', 'NULL', 'NUL', '')
์ด ์ต์ ์๋ ๋น ๋ฌธ์์ด์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
\\N
(์ฆ, NULL)
ENABLE_OCTAL = TRUE | FALSE
8์ง์ ์ซ์์ ๊ตฌ๋ฌธ ๋ถ์์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ถ์ธ์ ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
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
IGNORE_UTF8_ERRORS = TRUE | FALSE
UTF-8 ์ธ์ฝ๋ฉ ์ค๋ฅ๊ฐ ์ค๋ฅ ์กฐ๊ฑด์ ์์ฑํ๋์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค. ์ด๋
REPLACE_INVALID_CHARACTERS
์ ๋์ฒด ๊ตฌ๋ฌธ์ ๋๋ค.TRUE
๋ก ์ค์ ํ๋ฉด ์๋ชป๋ UTF-8 ์ํ์ค๊ฐ ์ ๋ถ ์ ๋์ฝ๋ ๋ฌธ์U+FFFD
(์ฆ, โ๋์ฒด ๋ฌธ์โ)๋ก ์๋์ผ๋ก ๋ฐ๋๋๋ค.FALSE
๋ก ์ค์ ํ๋ฉด ์๋ชป๋ UTF-8 ๋ฌธ์ ์ธ์ฝ๋ฉ์ด ๊ฐ์ง๋ ๋ ๋ก๋ฉ ์์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
FALSE
SKIP_BYTE_ORDER_MARK = TRUE | FALSE
์ ๋ ฅ ํ์ผ์ ์๋ ๋ชจ๋ BOM(๋ฐ์ดํธ ์์ ํ์)์ ๊ฑด๋๋ธ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค. BOM์ ๋ฐ์ดํฐ ํ์ผ์ ์์ ๋ถ๋ถ์์ ๋ฐ์ดํธ ์์์ ์ธ์ฝ๋ฉ ํ์์ ์ ์ํ๋ ๋ฌธ์ ์ฝ๋์ ๋๋ค.
FALSE
๋ก ์ค์ ํ๋ฉด Snowflake๊ฐ ๋ฐ์ดํฐ ํ์ผ์ ์๋ ๋ชจ๋ BOM์ ์ธ์ํ๋ฏ๋ก, BOM์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ํ ์ด๋ธ์ ์ฒซ ๋ฒ์งธ ์ด์ ๋ณํฉ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ ์ ์์ต๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
TRUE
TYPE = AVROยถ
COMPRESSION = AUTO | GZIP | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
๋ก๋ฉํ ๋ฐ์ดํฐ ํ์ผ์ ๋ํ ํ์ฌ ์์ถ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ํ๋ ๋ฌธ์์ด(์์)์ ๋๋ค. Snowflake๋ ์ด ์ต์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ์์ถ๋ ๋ฐ์ดํฐ ํ์ผ์ ์์ถํ ๋ฐฉ์์ ๊ฐ์งํด ๋ก๋๋ฅผ ์ํด ํ์ผ์ ์์ถ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
์ง์๋๋ ๊ฐ
์ฐธ๊ณ
AUTO
ํ์ฌ ์๋์ผ๋ก ๊ฐ์งํ ์ ์๋ Brotli ์์ถ ํ์ผ์ ์ ์ธํ๊ณ ์์ถ ์๊ณ ๋ฆฌ์ฆ์ด ์๋์ผ๋ก ๊ฐ์ง๋ฉ๋๋ค. Brotli ์์ถ ํ์ผ์ ๋ก๋ฉํ๋ ๊ฒฝ์ฐ
AUTO
๋์BROTLI
๋ฅผ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.GZIP
BROTLI
ZSTD
DEFLATE
Deflate ์์ถ ํ์ผ(zlib ํค๋ RFC1950 ํฌํจ).
RAW_DEFLATE
์์ Deflate ์์ถ ํ์ผ(ํค๋ RFC1951 ์ ์ธ).
NONE
๋ก๋ฉํ ๋ฐ์ดํฐ ํ์ผ์ด ์์ถ๋์ง ์์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
AUTO
.
์ฐธ๊ณ
๊ธฐ๋ณธ
AUTO
์ต์ ์ผ๋ก ํ์ผ ๋ฐ ์ฝ๋ฑ ์์ถ์ด ๋ชจ๋ ๊ฒฐ์ ๋๋ฏ๋ก ๊ธฐ๋ณธ ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์์ถ ์ต์ ์ง์ ์ ๋ธ๋ก(์ฝ๋ฑ) ์์ถ์ด ์๋ ํ์ผ ์์ถ์ ๊ฐ๋ฆฌํต๋๋ค.TRIM_SPACE = TRUE | FALSE
๋ฌธ์์ด์์ ์ ํ ๊ณต๋ฐฑ๊ณผ ํํ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํํธ์จ์ด์์ ํ๋๋ฅผ ๋ฐ์ดํ๋ก ๋ฌถ๊ณ ์ ํ ๊ณต๋ฐฑ์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ Snowflake๋ ์ฒซ ๋ฐ์ดํ ๋ฌธ์๊ฐ ์๋ ์ ํ ๊ณต๋ฐฑ์ ํ๋์ ์์ ๋ถ๋ถ์ผ๋ก ์ฝ์ต๋๋ค(์ฆ, ๋ฐ์ดํ๋ ํ๋ ๋ฐ์ดํฐ ๋ฌธ์์ด์ ์ผ๋ถ๋ก ํด์). ๋ฐ์ดํฐ ๋ก๋ฉ ์ค์ ๋ถํ์ํ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ ค๋ฉด ์ด ์ต์ ์
TRUE
๋ก ์ค์ ํ์ญ์์ค.์ด ํ์ผ ํ์ ์ต์ ์ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ Avro ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ ๋๋ง ๋ค์ ์์ ์ ์ ์ฉ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
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๋ก ๋ฐ๊ฟ๋๋ค. ๋ ์ด์์ ๋ฌธ์์ด์ ์ง์ ํ๋ ค๋ฉด ๋ฌธ์์ด ๋ชฉ๋ก์ ๊ดํธ๋ก ๋ฌถ๊ณ ์ผํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ์ ๊ฐ์ ๊ตฌ๋ถํฉ๋๋ค.
์ด ํ์ผ ํ์ ์ต์ ์ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ Avro ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ ๋๋ง ๋ค์ ์์ ์ ์ ์ฉ๋ฉ๋๋ค.
Snowflake๋ ๋ฐ์ดํฐ ํ์ ๊ณผ ๊ด๊ณ์์ด ๊ฐ์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ NULL๋ก ๋ณํํฉ๋๋ค. ์๋ฅผ ๋ค์ด
2
๊ฐ ๊ฐ์ผ๋ก ์ง์ ๋๋ฉด2
์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋ฌธ์์ด ๋๋ ์ซ์๋ก ๋ณํ๋ฉ๋๋ค.์:
NULL_IF = ('\N', 'NULL', 'NUL', '')
์ด ์ต์ ์๋ ๋น ๋ฌธ์์ด์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
\\N
(์ฆ, NULL)
TYPE = ORCยถ
TRIM_SPACE = TRUE | FALSE
๋ฌธ์์ด์์ ์ ํ ๊ณต๋ฐฑ๊ณผ ํํ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํํธ์จ์ด์์ ํ๋๋ฅผ ๋ฐ์ดํ๋ก ๋ฌถ๊ณ ์ ํ ๊ณต๋ฐฑ์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ Snowflake๋ ์ฒซ ๋ฐ์ดํ ๋ฌธ์๊ฐ ์๋ ์ ํ ๊ณต๋ฐฑ์ ํ๋์ ์์ ๋ถ๋ถ์ผ๋ก ์ฝ์ต๋๋ค(์ฆ, ๋ฐ์ดํ๋ ํ๋ ๋ฐ์ดํฐ ๋ฌธ์์ด์ ์ผ๋ถ๋ก ํด์). ๋ฐ์ดํฐ ๋ก๋ฉ ์ค์ ๋ถํ์ํ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ ค๋ฉด ์ด ์ต์ ์
TRUE
๋ก ์ค์ ํ์ญ์์ค.์ด ํ์ผ ํ์ ์ต์ ์ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ Orc ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ ๋๋ง ๋ค์ ์์ ์ ์ ์ฉ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
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๋ก ๋ฐ๊ฟ๋๋ค. ๋ ์ด์์ ๋ฌธ์์ด์ ์ง์ ํ๋ ค๋ฉด ๋ฌธ์์ด ๋ชฉ๋ก์ ๊ดํธ๋ก ๋ฌถ๊ณ ์ผํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ์ ๊ฐ์ ๊ตฌ๋ถํฉ๋๋ค.
์ด ํ์ผ ํ์ ์ต์ ์ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ Orc ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ ๋๋ง ๋ค์ ์์ ์ ์ ์ฉ๋ฉ๋๋ค.
Snowflake๋ ๋ฐ์ดํฐ ํ์ ๊ณผ ๊ด๊ณ์์ด ๊ฐ์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ NULL๋ก ๋ณํํฉ๋๋ค. ์๋ฅผ ๋ค์ด
2
๊ฐ ๊ฐ์ผ๋ก ์ง์ ๋๋ฉด2
์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋ฌธ์์ด ๋๋ ์ซ์๋ก ๋ณํ๋ฉ๋๋ค.์:
NULL_IF = ('\N', 'NULL', 'NUL', '')
์ด ์ต์ ์๋ ๋น ๋ฌธ์์ด์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
\\N
(์ฆ, NULL)
TYPE = PARQUETยถ
COMPRESSION = AUTO | SNAPPY | NONE
๋ก๋ฉํ ๋ฐ์ดํฐ ํ์ผ์ ๋ํ ํ์ฌ ์์ถ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ํ๋ ๋ฌธ์์ด(์์)์ ๋๋ค. Snowflake๋ ์ด ์ต์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ์์ถ๋ ๋ฐ์ดํฐ ํ์ผ์ ์์ถํ ๋ฐฉ์์ ๊ฐ์งํด ๋ก๋๋ฅผ ์ํด ํ์ผ์ ์์ถ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
์ง์๋๋ ๊ฐ
์ฐธ๊ณ
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๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
TRIM_SPACE = TRUE | FALSE
๋ฌธ์์ด์์ ์ ํ ๊ณต๋ฐฑ๊ณผ ํํ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํํธ์จ์ด์์ ํ๋๋ฅผ ๋ฐ์ดํ๋ก ๋ฌถ๊ณ ์ ํ ๊ณต๋ฐฑ์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ Snowflake๋ ์ฒซ ๋ฐ์ดํ ๋ฌธ์๊ฐ ์๋ ์ ํ ๊ณต๋ฐฑ์ ํ๋์ ์์ ๋ถ๋ถ์ผ๋ก ์ฝ์ต๋๋ค(์ฆ, ๋ฐ์ดํ๋ ํ๋ ๋ฐ์ดํฐ ๋ฌธ์์ด์ ์ผ๋ถ๋ก ํด์). ๋ฐ์ดํฐ ๋ก๋ฉ ์ค์ ๋ถํ์ํ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ ค๋ฉด ์ด ์ต์ ์
TRUE
๋ก ์ค์ ํ์ญ์์ค.์ด ํ์ผ ํ์ ์ต์ ์ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ Parquet ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ ๋๋ง ๋ค์ ์์ ์ ์ ์ฉ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
USE_LOGICAL_TYPE = TRUE | FALSE
Parquet ๋ ผ๋ฆฌ ์ ํ์ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค. Snowflake๋ ์ด ํ์ผ ํ์ ์ต์ ์ผ๋ก ๋ฐ์ดํฐ ๋ก๋ ์ค์ Parquet ๋ ผ๋ฆฌ ์ ํ์ ํด์ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ Parquet ๋ ผ๋ฆฌ ์ ํ ์ ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. Parquet ๋ ผ๋ฆฌ ์ ํ์ ํ์ฑํํ๋ ค๋ฉด ์ ํ์ผ ํ์ ์ต์ ์ ์์ฑํ ๋ USE_LOGICAL_TYPE์ TRUE๋ก ์ค์ ํ์ญ์์ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
USE_VECTORIZED_SCANNER = TRUE | FALSE
Parquet ํ์ผ์ ๋ก๋ํ ๋ ๋ฒกํฐํ๋ ์ค์บ๋๋ฅผ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
๊ธฐ๋ณธ๊ฐ์
FALSE
์ ๋๋ค. ํฅํ BCR์์ ๊ธฐ๋ณธ๊ฐ์TRUE
์ ๋๋ค. ์๋ก์ด ์ํฌ๋ก๋์๋USE_VECTORIZED_SCANNER = TRUE
๋ฅผ ์ค์ ํ๊ณ , ๊ธฐ์กด ์ํฌ๋ก๋์๋ ํ ์คํธ ํ์ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.๋ฒกํฐํ๋ ์ค์บ๋๋ฅผ ์ฌ์ฉํ๋ฉด Parquet ํ์ผ์ ์ด ํ์์ ์ ํฉํ๊ธฐ ๋๋ฌธ์ Parquet ํ์ผ ๋ก๋ฉ ๋๊ธฐ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. ์ค์บ๋๋ ์ ํํ ์ด์ ํ์ ์งํฉ ๋ฑ Parquet ํ์ผ์์ ๊ด๋ จ ์น์ ๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
USE_VECTORIZED_SCANNER
๊ฐTRUE
๋ก ์ค์ ๋ ๊ฒฝ์ฐ ๋ฒกํฐํ๋ ์ค์บ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋์์ ์ํํฉ๋๋ค.BINARY_AS_TEXT
์ต์ ์ ์ค์ ์ค์ ๋ ๊ฐ์ ๊ด๊ณ์์ด ํญ์FALSE
๋ก,USE_LOGICAL_TYPE
์ต์ ์ ํญ์TRUE
๋ก ์ทจ๊ธ๋ฉ๋๋ค.๋ฒกํฐํ๋ ์ค์บ๋๋ Parquet ๋งต ์ ํ์ ์ง์ํฉ๋๋ค. ๋งต ์ ํ ์ค์บ์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"my_map": { "k1": "v1", "k2": "v2" }
๋ค์ ์์ ์์ ๋ณผ ์ ์๋ฏ์ด ๋ฒกํฐํ๋ ์ค์บ๋๋ ์ถ๋ ฅ์
NULL
๊ฐ์ ํ์ํฉ๋๋ค."person": { "name": "Adam", "nickname": null, "age": 34, "phone_numbers": [ "1234567890", "0987654321", null, "6781234590" ] }
๋ฒกํฐํ๋ ์ค์บ๋๋ ์๊ฐ๊ณผ ํ์์คํฌํ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํฉ๋๋ค.
Parquet
Snowflake ๋ฒกํฐํ๋ ์ค์บ๋
TimeType(isAdjustedToUtc=True/False, ๋จ์=MILLIS/MICROS/NANOS)
TIME
TimestampType(isAdjustedToUtc=True, ๋จ์=MILLIS/MICROS/NANOS)
TIMESTAMP_LTZ
TimestampType(isAdjustedToUtc=False, ๋จ์=MILLIS/MICROS/NANOS)
TIMESTAMP_NTZ
INT96
TIMESTAMP_LTZ
USE_VECTORIZED_SCANNER
๊ฐFALSE
๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์ค์บ๋์ ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.์ด ์ต์ ์ Parquet ๋งต์ ์ง์ํ์ง ์์ต๋๋ค. ๋งต ์ ํ ์ค์บ์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"my_map": { "key_value": [ { "key": "k1", "value": "v1" }, { "key": "k2", "value": "v2" } ] }
๋ค์ ์์ ์์ ๋ณผ ์ ์๋ฏ์ด ์ด ์ต์ ์ ์ค์บ ์ถ๋ ฅ์
NULL
๊ฐ์ ๋ช ์์ ์ผ๋ก ํ์ํ์ง ์์ต๋๋ค."person": { "name": "Adam", "age": 34 "phone_numbers": [ "1234567890", "0987654321", "6781234590" ] }
์ด ์ต์ ์ ์๊ฐ๊ณผ ํ์์คํฌํ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํฉ๋๋ค.
Parquet
USE_LOGICAL_TYPE = TRUE์ธ ๊ฒฝ์ฐ
USE_LOGICAL_TYPE = FALSE์ธ ๊ฒฝ์ฐ
TimeType(isAdjustedToUtc=True/False, ๋จ์=MILLIS/MICROS)
TIME
TIME(ConvertedType์ด ์๋ ๊ฒฝ์ฐ)
INTEGER(ConvertedType์ด ์๋ ๊ฒฝ์ฐ)
TimeType(isAdjustedToUtc=True/False, ๋จ์=NANOS)
TIME
INTEGER
TimestampType(isAdjustedToUtc=True, ๋จ์=MILLIS/MICROS)
TIMESTAMP_LTZ
TIMESTAMP_NTZ
TimestampType(isAdjustedToUtc=True, ๋จ์=NANOS)
TIMESTAMP_LTZ
INTEGER
TimestampType(isAdjustedToUtc=False, ๋จ์=MILLIS/MICROS)
TIMESTAMP_NTZ
TIMESTAMP_LTZ(ConvertedType์ด ์๋ ๊ฒฝ์ฐ)
INTEGER(ConvertedType์ด ์๋ ๊ฒฝ์ฐ)
TimestampType(isAdjustedToUtc=False, ๋จ์=NANOS)
TIMESTAMP_NTZ
INTEGER
INT96
TIMESTAMP_NTZ
TIMESTAMP_NTZ
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
์ ํจํ์ง ์์ UTF-8 ๋ฌธ์๋ฅผ ์ ๋์ฝ๋ ๋์ฒด ๋ฌธ์(
๏ฟฝ
)๋ก ๋์ฒดํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ. ๋ณต์ฌ ์ต์ ์ ์ผ๋์ผ ๋ฌธ์ ๋์ฒด๋ฅผ ์ํํฉ๋๋ค.TRUE
๋ก ์ค์ ํ๋ฉด Snowflake๊ฐ ์๋ชป๋ UTF-8 ๋ฌธ์๋ฅผ ์ ๋์ฝ๋ ๋์ฒด ๋ฌธ์๋ก ๋ฐ๊ฟ๋๋ค.FALSE
๋ก ์ค์ ํ๋ฉด ์๋ชป๋ UTF-8 ๋ฌธ์ ์ธ์ฝ๋ฉ์ด ๊ฐ์ง๋ ๋ ๋ก๋ฉ ์์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
FALSE
NULL_IF = ( 'string1' [ , 'string2' , ... ] )
SQL NULL๋ก ๋ณํํ๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฌธ์์ด์ ๋๋ค. Snowflake๋ ๋ฐ์ดํฐ ๋ก๋ฉ ์์ค์ ์ด๋ฌํ ๋ฌธ์์ด์ SQL NULL๋ก ๋ฐ๊ฟ๋๋ค. ๋ ์ด์์ ๋ฌธ์์ด์ ์ง์ ํ๋ ค๋ฉด ๋ฌธ์์ด ๋ชฉ๋ก์ ๊ดํธ๋ก ๋ฌถ๊ณ ์ผํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ์ ๊ฐ์ ๊ตฌ๋ถํฉ๋๋ค.
์ด ํ์ผ ํ์ ์ต์ ์ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ Parquet ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ด์ ๋ก๋ฉํ ๋๋ง ๋ค์ ์์ ์ ์ ์ฉ๋ฉ๋๋ค.
Snowflake๋ ๋ฐ์ดํฐ ํ์ ๊ณผ ๊ด๊ณ์์ด ๊ฐ์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ NULL๋ก ๋ณํํฉ๋๋ค. ์๋ฅผ ๋ค์ด
2
๊ฐ ๊ฐ์ผ๋ก ์ง์ ๋๋ฉด2
์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋ฌธ์์ด ๋๋ ์ซ์๋ก ๋ณํ๋ฉ๋๋ค.์:
NULL_IF = ('\N', 'NULL', 'NUL', '')
์ด ์ต์ ์๋ ๋น ๋ฌธ์์ด์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
\N
(์ฆ, NULL)
TYPE = XMLยถ
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
IGNORE_UTF8_ERRORS = TRUE | FALSE
UTF-8 ์ธ์ฝ๋ฉ ์ค๋ฅ๊ฐ ์ค๋ฅ ์กฐ๊ฑด์ ์์ฑํ๋์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค. ์ด๋
REPLACE_INVALID_CHARACTERS
์ ๋์ฒด ๊ตฌ๋ฌธ์ ๋๋ค.TRUE
๋ก ์ค์ ํ๋ฉด ์๋ชป๋ UTF-8 ์ํ์ค๊ฐ ์ ๋ถ ์ ๋์ฝ๋ ๋ฌธ์U+FFFD
(์ฆ, โ๋์ฒด ๋ฌธ์โ)๋ก ์๋์ผ๋ก ๋ฐ๋๋๋ค.FALSE
๋ก ์ค์ ํ๋ฉด ์๋ชป๋ UTF-8 ๋ฌธ์ ์ธ์ฝ๋ฉ์ด ๊ฐ์ง๋ ๋ ๋ก๋ฉ ์์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
FALSE
PRESERVE_SPACE = TRUE | FALSE
XML ํ์๊ฐ ์์ ์ฝํ ์ธ ์ ์ ํ ๋ฐ ํํ ๊ณต๋ฐฑ์ ๋ณด์กดํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
STRIP_OUTER_ELEMENT = TRUE | FALSE
XML ํ์๊ฐ ์ธ๋ถ XML ์์๋ฅผ ์ ๊ฑฐํ์ฌ 2์ฐจ ์์ค ์์๋ฅผ ๋ณ๊ฐ์ ๋ฌธ์๋ก ๋ ธ์ถํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
DISABLE_AUTO_CONVERT = TRUE | FALSE
XML ํ์๊ฐ ์ซ์ ๊ฐ๊ณผ ๋ถ์ธ ๊ฐ์ ํ ์คํธ์์ ๊ธฐ๋ณธ ํํ์ผ๋ก ์๋ ๋ณํํ์ง ๋ชปํ๊ฒ ํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
์ ํจํ์ง ์์ UTF-8 ๋ฌธ์๋ฅผ ์ ๋์ฝ๋ ๋์ฒด ๋ฌธ์(
๏ฟฝ
)๋ก ๋์ฒดํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ. ๋ณต์ฌ ์ต์ ์ ์ผ๋์ผ ๋ฌธ์ ๋์ฒด๋ฅผ ์ํํฉ๋๋ค.TRUE
๋ก ์ค์ ํ๋ฉด Snowflake๊ฐ ์๋ชป๋ UTF-8 ๋ฌธ์๋ฅผ ์ ๋์ฝ๋ ๋์ฒด ๋ฌธ์๋ก ๋ฐ๊ฟ๋๋ค.FALSE
๋ก ์ค์ ํ๋ฉด ์๋ชป๋ UTF-8 ๋ฌธ์ ์ธ์ฝ๋ฉ์ด ๊ฐ์ง๋ ๋ ๋ก๋ฉ ์์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
FALSE
SKIP_BYTE_ORDER_MARK = TRUE | FALSE
์ ๋ ฅ ํ์ผ์ ์๋ ๋ชจ๋ BOM(๋ฐ์ดํธ ์์ ํ์)์ ๊ฑด๋๋ธ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค. BOM์ ๋ฐ์ดํฐ ํ์ผ์ ์์ ๋ถ๋ถ์์ ๋ฐ์ดํธ ์์์ ์ธ์ฝ๋ฉ ํ์์ ์ ์ํ๋ ๋ฌธ์ ์ฝ๋์ ๋๋ค.
FALSE
๋ก ์ค์ ํ๋ฉด Snowflake๊ฐ ๋ฐ์ดํฐ ํ์ผ์ ์๋ ๋ชจ๋ BOM์ ์ธ์ํ๋ฏ๋ก, BOM์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ํ ์ด๋ธ์ ์ฒซ ๋ฒ์งธ ์ด์ ๋ณํฉ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ ์ ์์ต๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
TRUE
๋ณต์ฌ ์ต์
(copyOptions
)ยถ
๋ค์ ๋ณต์ฌ ์ต์ (๊ณต๋ฐฑ, ์ผํ ๋๋ ์ค ๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ) ์ค ํ๋ ์ด์์ ์ง์ ํ ์ ์์ต๋๋ค.
ON_ERROR = CONTINUE | SKIP_FILE | SKIP_FILE_num | 'SKIP_FILE_num%' | ABORT_STATEMENT
- ์ฉ๋:
๋ฐ์ดํฐ ๋ก๋ฉ ์ ์ฉ
- ์ ์:
๋ก๋ฉ ์์ ์ ๋ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ง์ ํ๋ ๋ฌธ์์ด(์์)์ ๋๋ค.
์ค์
ON_ERROR ๋ณต์ฌ ์ต์ ๊ฐ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ์ญ์์ค. ๊ธฐ๋ณธ๊ฐ์ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์์ ์ ์ ํ์ง๋ง, ํญ์ ์ต์์ ์ต์ ์ธ ๊ฒ์ ์๋๋๋ค.
- ๊ฐ:
CONTINUE
์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ ํ์ผ์ ๊ณ์ ๋ก๋ฉํฉ๋๋ค. COPY ๋ฌธ์ ๋ฐ์ดํฐ ํ์ผ๋น ์ต๋ ํ๋์ ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
ROWS_PARSED ์ด ๊ฐ๊ณผ ROWS_LOADED ์ด ๊ฐ์ ์ฐจ๋ ๊ฒ์๋ ์ค๋ฅ๋ฅผ ํฌํจํ๋ ํ์ ๊ฐ์๋ฅผ ๋ํ๋ ๋๋ค. ํ์ง๋ง ์ด๋ค ํ์ ๊ฐ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ์ค๋ฅ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ํ์ผ์ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ณด๋ ค๋ฉด VALIDATION_MODE ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ VALIDATE ํจ์๋ฅผ ์ฟผ๋ฆฌํ์ญ์์ค.
SKIP_FILE
์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ ํ์ผ์ ๊ฑด๋๋๋๋ค.
SKIP_FILE
์์ ์ ์ค๋ฅ ๋ฐ๊ฒฌ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ ์ฒด ํ์ผ์ ๋ฒํผ๋งํฉ๋๋ค. ์ด๋ฌํ ์ด์ ๋กSKIP_FILE
์CONTINUE
๋๋ABORT_STATEMENT
๋ณด๋ค ๋๋ฆฝ๋๋ค. ์ ์ ์์ ์ค๋ฅ๋ก ์ธํด ํฐ ํ์ผ์ ๊ฑด๋๋ฐ๋ฉด ์ง์ฐ์ด ๋ฐ์ํ๊ณ ํฌ๋ ๋ง์ด ๋ญ๋น๋ ์ ์์ต๋๋ค. ๋ ผ๋ฆฌ์ ์ค๋ช ์ด ์๋ ํ์ผ์์ ๋ง์ ์์ ๋ ์ฝ๋๋ฅผ ๋ก๋ฉํ ๋(์: ํ์ผ์ด ๋๋ต์ ์ธ ๊ฐ๊ฒฉ์ผ๋ก ์๋ ์์ฑ๋จ) ๋์CONTINUE
๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.์ถ๊ฐ ํจํด:
SKIP_FILE_num
(์:SKIP_FILE_10
)ํ์ผ์์ ๋ฐ๊ฒฌ๋ ์ค๋ฅ ํ ์๊ฐ ์ง์ ๋ ์์ ๊ฐ๊ฑฐ๋ ์ด๊ณผํ๋ฉด ํ์ผ์ ๊ฑด๋๋๋๋ค.
'SKIP_FILE_num%'
(์:'SKIP_FILE_10%'
)ํ์ผ์์ ๋ฐ๊ฒฌ๋ ์ค๋ฅ ํ์ ๋ฐฑ๋ถ์จ์ด ์ง์ ๋ ๋ฐฑ๋ถ์จ์ ์ด๊ณผํ๋ฉด ํ์ผ์ ๊ฑด๋๋๋๋ค.
ABORT_STATEMENT
๋ฐ์ดํฐ ํ์ผ์์ ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๋ก๋ฉ ์์ ์ ์ค๋จํฉ๋๋ค.
๋ก๋ ์์ ์
FILES
๋งค๊ฐ ๋ณ์์ ๋ช ์์ ์ผ๋ก ์ง์ ๋ ๋ฐ์ดํฐ ํ์ผ์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ค๋จ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด (์์ปจ๋ ๋ฐ์ดํฐ ํ์ผ์ด ์กด์ฌํ์ง ์๊ฑฐ๋ ์ก์ธ์คํ ์ ์๋ ๋ฑ์ ์ด์ ๋ก) ๋ฐ์ดํฐ ํ์ผ์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ์๋ ๋ก๋ ์์ ์ด ์ค๋จ๋์ง ์์ต๋๋ค.๋ฐ์ดํฐ ํ์ผ์ด ์์ง๋์ง ์์์ผ๋ฏ๋ก COPY_HISTORY ์ ์ค๋จ๋ ์์ ์ ํ์๋์ง ์์ต๋๋ค. QUERY_HISTORY ์์ ์ค๋ฅ๊ฐ ์๋์ง ๊ฒ์ํด ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
- COPY๋ฅผ ์ฌ์ฉํ ๋๋ ๋ก๋ฉ:
ABORT_STATEMENT
- Snowpipe:
SKIP_FILE
SIZE_LIMIT = num
- ์ ์:
์ฃผ์ด์ง COPY ๋ฌธ์ ๋ํด ๋ก๋ฉํ ๋ฐ์ดํฐ์ ์ต๋ ํฌ๊ธฐ(๋ฐ์ดํธ)๋ฅผ ์ง์ ํ๋ (0๋ณด๋ค ํฐ) ์ซ์์ ๋๋ค. ์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด COPY ์์ ์์ ํ์ผ ๋ก๋ฉ์ด ์ค๋จ๋ฉ๋๋ค. ์ด ์ต์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ COPY ๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ณตํต ํ์ผ ๊ทธ๋ฃน์ ๋ก๋ฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ๊ฐ์ ๋ฌธ์ ๋ํด ์ง์ ๋
SIZE_LIMIT
๊ฐ์ ์ด๊ณผํ ๋๊น์ง ๋ฐ์ดํฐ ๋ก๋ฉ์ด ๊ณ์๋ ํ์ ๊ทธ๋ค์ ๋ฌธ์ผ๋ก ์ด๋ํฉ๋๋ค.์๋ฅผ ๋ค์ด, ์คํ ์ด์ง ๊ฒฝ๋ก์ ์๋ ํ์ผ ์ธํธ์ ํฌ๊ธฐ๊ฐ ๊ฐ๊ฐ 10MB๋ผ๊ณ ํด๋ด ์๋ค. ์ฌ๋ฌ COPY ๋ฌธ์ด SIZE_LIMIT๋ฅผ
25000000
(25MB)๋ก ์ค์ ํ๋ฉด ๊ฐ๊ฐ 3๊ฐ์ ํ์ผ์ ๋ก๋ฉํฉ๋๋ค. ์ฆ,SIZE_LIMIT
์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด ๊ฐ COPY ์์ ์ด ์ค๋จ๋ฉ๋๋ค.๋ก๋ฉํ ํ์ผ์ด ํ๋๋ผ๋ ์๋ค๋ฉด
SIZE_LIMIT
์ ๋ํด ์ง์ ๋ ๊ฐ๊ณผ ๊ด๊ณ์์ด ์ต์ํ ํ ๊ฐ์ ํ์ผ์ด ๋ก๋ฉ๋ฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
null(ํฌ๊ธฐ ์ ํ ์์)
PURGE = TRUE | FALSE
- ์ ์:
๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ก๋ฉ๋ ํ ์คํ ์ด์ง์์ ๋ฐ์ดํฐ ํ์ผ์ ์๋์ผ๋ก ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
์ด ์ต์ ์
TRUE
๋ก ์ค์ ํ๋ฉด ์ฑ๊ณต์ ์ผ๋ก ๋ก๋ฉ๋ ๋ฐ์ดํฐ ํ์ผ์ ์ ๊ฑฐํ๊ธฐ ์ํ ์ต์ ์ ๋ ธ๋ ฅ์ด ์ด๋ฃจ์ด์ง๋๋ค. ์ด๋ค ์ด์ ๋ก๋ ์ ๊ฑฐ ์์ ์ด ์คํจํ ๊ฒฝ์ฐ ํ์ฌ๋ ์๋ฌด๋ฐ ์ค๋ฅ๋ ๋ฐํ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ (LIST ๋ฅผ ์ฌ์ฉํ์ฌ) ์คํ ์ด์ง๋ ํ์ผ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋์ดํ๊ณ ์ฑ๊ณต์ ์ผ๋ก ๋ก๋ฉ๋ ํ์ผ์ด ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.- ๊ธฐ๋ณธ๊ฐ:
FALSE
RETURN_FAILED_ONLY = TRUE | FALSE
- ์ ์:
๋ฌธ ๊ฒฐ๊ณผ์์ ๋ก๋ฉํ์ง ๋ชปํ ํ์ผ๋ง ๋ฐํํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
MATCH_BY_COLUMN_NAME = CASE_SENSITIVE | CASE_INSENSITIVE | NONE
- ์ ์:
๋ฐ์ดํฐ์ ํ์๋ ํด๋น ์ด๊ณผ ์ผ์นํ๋ ๋์ ํ ์ด๋ธ์ ์ด๋ก ๋ฐ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ฌธ์์ด์ ๋๋ค.
์ค์
๋ชจ๋ ๊ฒฝ์ฐ์ ๋ก๋ ์ค ๋ฐ์ดํฐ ๋ณํ์ ์ํด SELECT ๋ฌธ๊ณผ ํจ๊ป MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ์ด ๋ ์ต์ ์ ๋ณ๋๋ก ์ฌ์ฉํ ์ ์์ง๋ง ํจ๊ป ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ ค๊ณ ํ๋ฉด
SQL compilation error: match_by_column_name is not supported with copy transform.
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.์๋ฅผ ๋ค์ด ๋ค์ ๊ตฌ๋ฌธ์ ํ์ฉ๋์ง ์์ต๋๋ค.
COPY INTO [<namespace>.]<table_name> [ ( <col_name> [ , <col_name> ... ] ) ] FROM ( SELECT [<alias>.]$<file_col_num>[.<element>] [ , [<alias>.]$<file_col_num>[.<element>] ... ] FROM { internalStage | externalStage } ) [ FILES = ( '<file_name>' [ , '<file_name>' ] [ , ... ] ) ] [ PATTERN = '<regex_pattern>' ] [ FILE_FORMAT = ( { FORMAT_NAME = '[<namespace>.]<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ] MATCH_BY_COLUMN_NAME = CASE_SENSITIVE | CASE_INSENSITIVE | NONE [ other copyOptions ]
์์ธํ ๋ด์ฉ์ ๋ก๋ ์ค ๋ฐ์ดํฐ ๋ณํํ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ด ๋ณต์ฌ ์ต์ ์ ๋ค์ ๋ฐ์ดํฐ ํ์ ์ ๋ํด ์ง์๋ฉ๋๋ค.
JSON
Avro
ORC
Parquet
CSV
์ด์ด ์ผ์นํ๋ ค๋ฉด ๋ค์ ๊ธฐ์ค์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ์ ํ์๋ ์ด์ ์ด๋ฆ์ด ํ ์ด๋ธ์ ์๋ ์ด์ ์ด๋ฆ๊ณผ ์ ํํ ๊ฐ์์ผ ํฉ๋๋ค. ์ด ๋ณต์ฌ ์ต์ ์ ์ด ์ด๋ฆ์ ๋/์๋ฌธ์ ๊ตฌ๋ถ์ ์ง์ํฉ๋๋ค. ์ด ์์๋ ์ค์ํ์ง ์์ต๋๋ค.
ํ ์ด๋ธ์ ์ด์ ์๋ ๋ฐ์ดํฐ ํ์ ์ด ๋ฐ์ดํฐ์ ํ์๋ ์ด์ ๊ฐ๊ณผ ํธํ๋์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์์ด, ์ซ์, ๋ถ์ธ ๊ฐ์ ๋ชจ๋ ๋ฒ ๋ฆฌ์ธํธ ์ด์ ๋ก๋ฉํ ์ ์์ต๋๋ค.
- ๊ฐ:
CASE_SENSITIVE
|CASE_INSENSITIVE
๋ฐ์ดํฐ์ ํ์๋ ํด๋น ์ด๊ณผ ์ผ์นํ๋ ๋์ ํ ์ด๋ธ์ ์ด๋ก ๋ฐ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํฉ๋๋ค. ์ด ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๊ฑฐ๋(
CASE_SENSITIVE
) ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค(CASE_INSENSITIVE
).COPY ์์ ์ ๋์ ํ ์ด๋ธ์ ์๋ ํ๋ ์ด์์ ์ด์ด ๋ฐ์ดํฐ ํ์ผ์ ํ์๋ ์ด๊ณผ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ ์ฐพ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ํ์ผ์ ๊ฐ์ด ์ด์ ๋ก๋ฉ๋ฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด ํ์ผ์ ๊ฐ ๋ ์ฝ๋์ ๋ํ NULL ๊ฐ ์ธํธ๊ฐ ํ ์ด๋ธ์ ๋ก๋ฉ๋ฉ๋๋ค.
์ฐธ๊ณ
๋ฐ์ดํฐ ํ์ผ์ ์ผ์นํ์ง ์๋ ์ด์ด ์ถ๊ฐ๋ก ์๋ ๊ฒฝ์ฐ ์ด๋ฌํ ์ด์ ๊ฐ์ ๋ก๋ฉ๋์ง ์์ต๋๋ค.
๋์ ํ ์ด๋ธ์ ์ผ์นํ์ง ์๋ ์ด์ด ์ถ๊ฐ๋ก ์๋ ๊ฒฝ์ฐ COPY ์์ ์ ์ด๋ฌํ ์ด์ NULL ๊ฐ์ ์ฝ์ ํฉ๋๋ค. ์ด๋ฌํ ์ด์ NULL ๊ฐ์ ์ง์ํด์ผ ํฉ๋๋ค.
NONE
COPY ์์ ์์๋ ๋ฐ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฒ ๋ฆฌ์ธํธ ์ด์ ๋ก๋ฉํ๊ฑฐ๋, COPY ๋ฌธ์ ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณํํฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
NONE
์ฐธ๊ณ
ํ์ฌ๋ ๋ค์ ์ ํ ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค.
COPY ๋ฌธ์ MATCH_BY_COLUMN_NAME์
VALIDATION_MODE
๋งค๊ฐ ๋ณ์์ ํจ๊ป ์ฌ์ฉํ์ฌ ์คํ ์ด์ง ์ํ ๋ฐ์ดํฐ๋ฅผ ๋์ ํ ์ด๋ธ์ ๋ก๋ฉํ๋ ๋์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ ์ ์์ต๋๋ค.Parquet ๋ฐ์ดํฐ๋ง ํด๋น. MATCH_BY_COLUMN_NAME์ด
CASE_SENSITIVE
๋๋CASE_INSENSITIVE
๋ก ์ค์ ๋์ด ์์ ๋๋ ์ด ๊ฐ์ด ๋น์ด ์๋ ๊ฒฝ์ฐ(์:"col1": ""
) ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
INCLUDE_METADATA = ( column_name = METADATA$field [ , column_name = METADATA$field ... ] )
- ์ ์:
๋์ ํ ์ด๋ธ์ ๊ธฐ์กด ์ด๊ณผ METADATA$ ์ด ๊ฐ์ ์ฌ์ฉ์ ์ ์ ๋งคํ์ ๋๋ค. ์ด ๋ณต์ฌ ์ต์ ์ MATCH_BY_COLUMN_NAME ๋ณต์ฌ ์ต์ ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
METADATA$field
์ ์ ํจํ ์ ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.METADATA$FILENAME
METADATA$FILE_ROW_NUMBER
METADATA$FILE_CONTENT_KEY
METADATA$FILE_LAST_MODIFIED
METADATA$START_SCAN_TIME
๋ฉํ๋ฐ์ดํฐ ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์คํ ์ด์ง๋ ํ์ผ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ์ฟผ๋ฆฌํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ด ๋ณต์ฌ ์ต์ ์ ์ฌ์ฉํ์ฌ ๋งคํ์ ์ ์ํ๋ฉด ๋ค์ ์์ ์ ๊ฐ์ด
column_name
์ด์ด ์ง์ ๋ ๋ฉํ๋ฐ์ดํฐ ๊ฐ์ผ๋ก ์ฑ์์ง๋๋ค.COPY INTO table1 FROM @stage1 MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE INCLUDE_METADATA = ( ingestdate = METADATA$START_SCAN_TIME, filename = METADATA$FILENAME);
+-----+-----------------------+---------------------------------+-----+ | ... | FILENAME | INGESTDATE | ... | |---------------------------------------------------------------+-----| | ... | example_file.json.gz | Thu, 22 Feb 2024 19:14:55 +0000 | ... | +-----+-----------------------+---------------------------------+-----+
- ๊ธฐ๋ณธ๊ฐ:
NULL
์ฐธ๊ณ
INCLUDE_METADATA
๋์ ์ด ์ด๋ฆ์ ํ ์ด๋ธ์ ๋จผ์ ์์ด์ผ ํฉ๋๋ค. ๋์ ์ด ์ด๋ฆ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ์ถ๊ฐ๋์ง ์์ต๋๋ค.INCLUDE_METADATA
์ด์๋ ๊ณ ์ ํ ์ด ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค.INCLUDE_METADATA
๋์ ์ด์ด ๋ฐ์ดํฐ ํ์ผ์ ์ด๊ณผ ์ด๋ฆ์ด ์ถฉ๋ํ๋ ๊ฒฝ์ฐINCLUDE_METADATA
์์ ์ ์ํMETADATA$
๊ฐ์ด ์ฐ์ ํฉ๋๋ค.CSV๋ฅผ
INCLUDE_METADATA
๋ก ๋ก๋ํ ๋๋ ํ์ผ ํ์ ์ต์ ERROR_ON_COLUMN_COUNT_MISMATCH
๋ฅผFALSE
๋ก ์ค์ ํฉ๋๋ค.
ENFORCE_LENGTH = TRUE | FALSE
- ์ ์:
(๋ค๋ฅธ ์์คํ ๊ณผ์ ํธํ์ฑ์ ์ํด) ๋ฐ๋ ๋ ผ๋ฆฌ๋ฅผ ๊ฐ์ง
TRUNCATECOLUMNS
์ ๋์ฒด ๊ตฌ๋ฌธ๋์ ์ด ๊ธธ์ด๋ฅผ ์ด๊ณผํ๋ ํ ์คํธ ๋ฌธ์์ด์ ์๋ฅผ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
TRUE
์ธ ๊ฒฝ์ฐ COPY ๋ฌธ ์คํ ์ ๋ก๋ฉ๋ ๋ฌธ์์ด์ด ๋์ ์ด ๊ธธ์ด๋ฅผ ์ด๊ณผํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.FALSE
์ธ ๊ฒฝ์ฐ์๋ ๋ฌธ์์ด์ด ๋์ ์ด ๊ธธ์ด์ ๋ง์ถฐ ์๋์ผ๋ก ์๋ฆฝ๋๋ค.
์ด ๋ณต์ฌ ์ต์ ์ ๊ด๊ณํ ํ ์ด๋ธ์ ์๋ ๋ณ๊ฐ์ ์ด์ ๋ก๋ฉ ์ ๋ฐ์ ํ ๋ฐ์ดํฐ์ ๋ฌธ์์ด ๊ฐ๋ฟ ์๋๋ผ CSV ๋ฐ์ดํฐ๋ ์ง์ํฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
TRUE
์ฐธ๊ณ
๋์ ๋ฌธ์์ด ์ด์ ๊ธธ์ด๊ฐ ์ต๋๊ฐ(์:
VARCHAR (16777216)
)์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์์ ๋ฌธ์์ด์ ์ด ๊ธธ์ด๋ฅผ ์ด๊ณผํ ์ ์์ผ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด COPY ๋ช ๋ น์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.์ด ๋งค๊ฐ ๋ณ์๋ ๊ธฐ๋ฅ์ ์ผ๋ก๋
TRUNCATECOLUMNS
์ ๊ฐ์ง๋ง, ๋์์ ๋ฐ๋๋ก ์ด๋ฃจ์ด์ง๋๋ค. ์ด ๋งค๊ฐ ๋ณ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํธํ์ฑ์ ์ํด ์ ๊ณต๋ฉ๋๋ค. ์ํ๋ ์ถ๋ ฅ์ ์์ฑํ๋ ค๋ฉด COPY ๋ฌธ์ ์ด ๋ ๋งค๊ฐ ๋ณ์ ์ค ํ๋๋ง ํฌํจํด์ผ ํฉ๋๋ค.
TRUNCATECOLUMNS = TRUE | FALSE
- ์ ์:
(๋ค๋ฅธ ์์คํ ๊ณผ์ ํธํ์ฑ์ ์ํด) ๋ฐ๋ ๋ ผ๋ฆฌ๋ฅผ ๊ฐ์ง
ENFORCE_LENGTH
์ ๋์ฒด ๊ตฌ๋ฌธ๋์ ์ด ๊ธธ์ด๋ฅผ ์ด๊ณผํ๋ ํ ์คํธ ๋ฌธ์์ด์ ์๋ฅผ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค.
TRUE
์ธ ๊ฒฝ์ฐ์๋ ๋ฌธ์์ด์ด ๋์ ์ด ๊ธธ์ด์ ๋ง์ถฐ ์๋์ผ๋ก ์๋ฆฝ๋๋ค.FALSE
์ธ ๊ฒฝ์ฐ COPY ๋ฌธ ์คํ ์ ๋ก๋ฉ๋ ๋ฌธ์์ด์ด ๋์ ์ด ๊ธธ์ด๋ฅผ ์ด๊ณผํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๋ณต์ฌ ์ต์ ์ ๊ด๊ณํ ํ ์ด๋ธ์ ์๋ ๋ณ๊ฐ์ ์ด์ ๋ก๋ฉ ์ ๋ฐ์ ํ ๋ฐ์ดํฐ์ ๋ฌธ์์ด ๊ฐ๋ฟ ์๋๋ผ CSV ๋ฐ์ดํฐ๋ ์ง์ํฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
์ฐธ๊ณ
๋์ ๋ฌธ์์ด ์ด์ ๊ธธ์ด๊ฐ ์ต๋๊ฐ(์:
VARCHAR (16777216)
)์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์์ ๋ฌธ์์ด์ ์ด ๊ธธ์ด๋ฅผ ์ด๊ณผํ ์ ์์ผ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด COPY ๋ช ๋ น์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.์ด ๋งค๊ฐ ๋ณ์๋ ๊ธฐ๋ฅ์ ์ผ๋ก๋
ENFORCE_LENGTH
์ ๊ฐ์ง๋ง, ๋์์ ๋ฐ๋๋ก ์ด๋ฃจ์ด์ง๋๋ค. ์ด ๋งค๊ฐ ๋ณ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํธํ์ฑ์ ์ํด ์ ๊ณต๋ฉ๋๋ค. ์ํ๋ ์ถ๋ ฅ์ ์์ฑํ๋ ค๋ฉด COPY ๋ฌธ์ ์ด ๋ ๋งค๊ฐ ๋ณ์ ์ค ํ๋๋ง ํฌํจํด์ผ ํฉ๋๋ค.
FORCE = TRUE | FALSE
- ์ ์:
์ด์ ์ ๋ก๋ฉ๋์๊ณ ๊ทธ ์ดํ๋ก ๋ณ๊ฒฝ๋์ง ์์๋์ง ์ฌ๋ถ์๋ ๊ด๊ณ์์ด ๋ชจ๋ ํ์ผ์ ๋ก๋ฉํ๋๋ก ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค. ์ด ์ต์ ์ ํ์ผ์ ๋ค์ ๋ก๋ฉํ์ฌ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
LOAD_UNCERTAIN_FILES = TRUE | FALSE
- ์ ์:
๋ก๋ ์ํ๋ฅผ ์ ์ ์๋ ํ์ผ์ ๋ก๋ฉํ๋๋ก ์ง์ ํ๋ ๋ถ์ธ์ ๋๋ค. COPY ๋ช ๋ น์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฌํ ํ์ผ์ ๊ฑด๋๋๋๋ค.
๋ค์ ์กฐ๊ฑด์ด ๋ชจ๋ ์ฐธ์ด๋ฉด ๋ก๋ ์ํ๋ฅผ ์ ์ ์์ต๋๋ค.
ํ์ผ์ LAST_MODIFIED ๋ ์ง(์ฆ, ํ์ผ์ ์คํ ์ด์งํ ๋ ์ง)๊ฐ 64์ผ๋ณด๋ค ์ค๋๋์์ต๋๋ค.
์ด๊ธฐ ๋ฐ์ดํฐ ์ธํธ๊ฐ 65์ผ ์ด์ ์ ์ ํ ์ด๋ธ์ ๋ก๋ฉ๋์์ต๋๋ค.
ํ์ผ์ ํ ์ด๋ธ์ ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฏธ ๋ก๋ฉํ ๊ฒฝ์ฐ ์ด ์ด๋ฒคํธ๊ฐ 65์ผ ์ด์ ์ ์ ๋ฐ์ํ ๊ฒ์ ๋๋ค.
๋ก๋ ์ํ๋ฅผ ์๊ณ ์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด COPY ๋ช ๋ น์ด ๋ชจ๋ ํ์ผ์ ๊ฐ์ ๋ก ๋ก๋ฉํ๋๋ก ํ๋ ค๋ฉด
FORCE
์ต์ ์ ๋์ ์ฌ์ฉํ์ญ์์ค.๋ก๋ ์ํ ๋ถํ์ค์ฑ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ค๋๋ ํ์ผ ๋ก๋ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- ๊ธฐ๋ณธ๊ฐ:
FALSE
FILE_PROCESSOR = (SCANNER = custom_scanner_type SCANNER_OPTIONS = (scanner_options))
- ์ ์:
๋น์ ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ์ค์บ๋์ ์ค์บ๋ ์ต์ ์ ์ง์ ํฉ๋๋ค.
SCANNER
(ํ์): ๋น์ ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ์ฌ์ฉ์ ์ง์ ์ค์บ๋์ ์ ํ์ ์ง์ ํฉ๋๋ค. ํ์ฌ๋document_ai
์ฌ์ฉ์ ์ง์ ์ค์บ๋ ์ ํ๋ง ์ง์๋ฉ๋๋ค.SCANNER_OPTIONS
: ์ฌ์ฉ์ ์ง์ ์ค์บ๋ ์ ํ์ ์์ฑ์ ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด,document_ai
๋ฅผSCANNER
์ ์ ํ์ผ๋ก ์ง์ ํ๋ ๊ฒฝ์ฐdocument_ai
์ ์์ฑ์ ์ง์ ํด์ผ ํฉ๋๋ค.document_ai
์ ๋ํด ๋ฏธ๋ฆฌ ์ ์๋ ์์ฑ ์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.project_name
: Document AI ๋ชจ๋ธ์ ์์ฑํ๋ ํ๋ก์ ํธ์ ์ด๋ฆ์ ๋๋ค.model_name
(document_ai
์ ํ์): Document AI ๋ชจ๋ธ์ ์ด๋ฆ์ ๋๋ค.model_version
(document_ai
์ ํ์): Document AI ๋ชจ๋ธ์ ๋ฒ์ ์ ๋๋ค.
์์ธํ ๋ด์ฉ์ Document AI๋ก ๋น์ ํ ๋ฐ์ดํฐ ๋ก๋ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
์ด ๋ณต์ฌ ์ต์ ์
MATCH_BY_COLUMN_NAME
์์ ์๋ํ์ง ์์ต๋๋ค.
LOAD_MODE = { FULL_INGEST | ADD_FILES_COPY }
- ์ ์:
Parquet ํ์ผ์์ Snowflake๊ฐ ๊ด๋ฆฌํ๋ Iceberg ํ ์ด๋ธ ๋ก ๋ฐ์ดํฐ ๋ก๋ฉ ์ ์ฌ์ฉํ ๋ชจ๋๋ฅผ ์ง์ ํฉ๋๋ค.
FULL_INGEST
: Snowflake๊ฐ ํ์ผ์ ์ค์บํ๊ณ Iceberg ํ ์ด๋ธ์ ๊ธฐ๋ณธ ์์น ์๋์ Parquet ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์์ฑํฉ๋๋ค. ํ์ผ์ Iceberg ํ ์ด๋ธ์ ๋ฑ๋กํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ฑฐ๋ ๋ณํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด ์ ํ ์ฌํญ์ ์ฌ์ฉํ์ญ์์ค.ADD_FILES_COPY
: Snowflake๋ ์๋ณธ Parquet ํ์ผ์ ์๋ฒ ์ธก์์ Iceberg ํ ์ด๋ธ์ ๊ธฐ๋ณธ ์์น๋ก ๋ณต์ฌํ ๋ค์ ํ์ผ์ ํ ์ด๋ธ์ ๋ฑ๋กํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ Parquet ํ์ผ์ ๋ฆฌ์ ๊ฐ ๋๋ ํด๋ผ์ฐ๋ ๊ฐ์ ๋์ด Iceberg ํ ์ด๋ธ๋ก ์์งํ ์ ์์ต๋๋ค.์ฐธ๊ณ
ADD_FILES_COPY
์ต์ ์ ๋ณํ ์์ด Iceberg ํธํ ์์ Parquet ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๊ฒฝ์ฐ์๋ง ์ง์๋ฉ๋๋ค. ์์ Iceberg ํธํ Parquet ํ์ผ์ Iceberg ์นดํ๋ก๊ทธ์ ๋ฑ๋ก๋์ด ์์ง ์์ง๋ง Iceberg ํธํ ๋ฐ์ดํฐ ํ์ ์ ํฌํจํฉ๋๋ค.ํ์ผ ์ฝ๊ธฐ ์ค๋ฒํค๋๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ์ด ์ต์ ์ ์ฌ์ฉํฉ๋๋ค. ์ ์ฅ์ ๋น์ฉ์ ์ต์ํํ๋ ค๋ฉด ์ด ์ต์ ๊ณผ ํจ๊ป
PURGE = TRUE
๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ก๋ฉ๋ ํ Snowflake๊ฐ ์๋ ์์น์์ ๋ฐ์ดํฐ ํ์ผ์ ์๋์ผ๋ก ์ ๊ฑฐํ๋๋ก ์ง์ํฉ๋๋ค.
์ถ๊ฐ ์ฌ์ฉ๋ฒ ๋ ธํธ๋ LOAD_MODE ์ฌ์ฉ๋ฒ ๋ ธํธ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค. ์๋ Iceberg์ ํธํ๋๋ Parquet ๋ฐ์ดํฐ๋ฅผ Iceberg ํ ์ด๋ธ์ ๋ก๋ํ๊ธฐ ์ ์ฐธ์กฐํ์ญ์์ค.
- ๊ธฐ๋ณธ๊ฐ:
FULL_INGEST
์ฌ์ฉ๋ฒ ๋ ธํธยถ
์ผ๋ถ ์ฌ์ฉ ์ฌ๋ก๋ ์์ ํ ์ง์๋์ง ์์ผ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํฌํจํ์ฌ ์ผ๊ด๋์ง ์๊ฑฐ๋ ์๊ธฐ์น ์์ ON_ERROR ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
SELECT ๋ฌธ์ DISTINCT ํค์๋ ์ง์ .
ํด๋ฌ์คํฐ๋ ํ ์ด๋ธ๊ณผ ํจ๊ป COPY ์ฌ์ฉ.
CSV ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ๋ ์คํธ๋ฆผ ๊ฐ ๋์ ํ ์ด๋ธ์ ์๋ ๊ฒฝ์ฐ ON_ERROR ๋ณต์ฌ ์ต์ ์ด ์์๋๋ก ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
Google Cloud Storage์์๋ง ๋ก๋ฉ: ์ธ๋ถ ์คํ ์ด์ง์ ๋ํด ๋ฐํ๋ ์ค๋ธ์ ํธ์ ๋ชฉ๋ก์ ํ๋ ์ด์์ โ๋๋ ํฐ๋ฆฌ blobโ์ด ํฌํจ๋ ์ ์๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋์ ๋ฌธ์(
/
)๋ก ๋๋๋ ๊ฒฝ๋ก์ด๋ฉฐ ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.LIST @my_gcs_stage; +---------------------------------------+------+----------------------------------+-------------------------------+ | name | size | md5 | last_modified | |---------------------------------------+------+----------------------------------+-------------------------------| | my_gcs_stage/load/ | 12 | 12348f18bcb35e7b6b628ca12345678c | Mon, 11 Sep 2019 16:57:43 GMT | | my_gcs_stage/load/data_0_0_0.csv.gz | 147 | 9765daba007a643bdff4eae10d43218y | Mon, 11 Sep 2019 18:13:07 GMT | +---------------------------------------+------+----------------------------------+-------------------------------+
Google์์ ์ ๊ณตํ๋ ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ Google Cloud console ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค ๋ ์ด๋ฌํ blob์ด ๋์ด๋ฉ๋๋ค.
์ค๋ธ์ ํธ ๋ชฉ๋ก์ ๋๋ ํฐ๋ฆฌ blob์ด ํฌํจ๋๋ฉด ์คํ ์ด์ง๋ฅผ ์ฐธ์กฐํ๋ COPY ๋ฌธ์ด ์คํจํ ์ ์์ต๋๋ค. ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ์คํ ์ด์ง์ ํ์ผ ๋ชฉ๋ก์ ๋๋ ํฐ๋ฆฌ blob์ด ํฌํจ๋ ๊ฒฝ์ฐ ํ์ผ ํจํด(์ฆ, PATTERN ์ ) ์ผ์น๋ฅผ ์ฌ์ฉํ์ฌ ํฌํจํ ํ์ผ์ ์๋ณํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ ์ด ํญ๋ชฉ์ ์๋ ํจํด ์ผ์น๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ฉ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค. ๋๋ COPY ๋ฌธ์ ON_ERROR = SKIP_FILE์ ์ค์ ํฉ๋๋ค.
STORAGE_INTEGRATION
,CREDENTIALS
,ENCRYPTION
์ ๊ฐ์ธ/๋ณดํธ๋ ์ ์ฅ์ ์์น์์ ์ง์ ๋ก๋ฉํ๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉ๋ฉ๋๋ค.๊ณต์ฉ ๋ฒํท์์ ๋ก๋ฉํ๋ ๊ฒฝ์ฐ ๋ณด์ ์ก์ธ์ค๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๋ช ๋ช ๋ ์ธ๋ถ ์คํ ์ด์ง์์ ๋ก๋ฉํ๋ ๊ฒฝ์ฐ ์คํ ์ด์ง์์ ๋ฒํท์ ์ก์ธ์คํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
COPY ๋ช ๋ น์ ์คํํ๋ ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ช ๋ น์ด ์๋ฃ๋ ํ VALIDATE ํ ์ด๋ธ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์์ฑํ ํ์ผ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
VALIDATE ํจ์๋ ํ์ค ๋ฐ์ดํฐ ๋ก๋ฉ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ COPY ๋ช ๋ น์ ์ถ๋ ฅ๋ง ๋ฐํํ๋ฉฐ, ๋ฐ์ดํฐ ๋ก๋ฉ(์: ๋ฐ์ดํฐ ์ด์ ์ผ๋ถ ๋ก๋ฉ ๋๋ ๋ฐ์ดํฐ ์ด ์ฌ์ ๋ ฌ) ์ค ๋ณํ์ ์ํํ๋ COPY ๋ช ๋ น์ ์ง์ํ์ง ์์ต๋๋ค.
FORCE = TRUE
๋ฅผ ๋ณต์ฌ ์ต์ ์ค ํ๋๋ก ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ์ด ๋ช ๋ น์ ํ ์ด๋ธ๋ก ์ด๋ฏธ ๋ก๋ฉ๋ ์คํ ์ด์ง ์ํ ๋ฐ์ดํฐ ํ์ผ์ ๋ฌด์ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ก๋ฉํ๋ ค๋ฉดFORCE = TRUE
๋ฅผ ์ง์ ํ๊ฑฐ๋ ํ์ผ์ ์์ ํ๊ณ ๋ค์ ์คํ ์ด์งํด์ผ ์ ์ฒดํฌ์ฌ์ด ์์ฑ๋ฉ๋๋ค.COPY ๋ช ๋ น์ Parquet ํ์ผ์ ๋ฐ์ดํฐ ํ์ ๋ณํ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ์ง ์์ต๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ํ ์ด๋ธ ๋ก๋ฉ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฐ์ดํฐ ๋ก๋ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
LOAD_MODE
๋ฅผ ์ฌ์ฉํ์ฌ Iceberg ํธํ Parquet ํ์ผ์์ ๋ก๋ํ๊ธฐ:LOAD_MODE = ADD_FILES_COPY
์ต์ ์ ์ฌ์ฉํ ๋๋ ๋ค์ ์ ์ ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.๋์ ํ ์ด๋ธ์ ์์ค Parquet ํ์ผ ๋ฐ์ดํฐ ํ์ ๊ณผ ํธํ๋๋ ์ด ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์ง Snowflake ๊ด๋ฆฌ Iceberg ํ ์ด๋ธ์ด์ด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Apache Icebergโข ํ ์ด๋ธ์ ๋ฐ์ดํฐ ํ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์์ค ํ์ผ ํ์์ Iceberg ํธํ Parquet์ด์ด์ผ ํ๋ฉฐ ๋ฒกํฐํ๋ ์ค์บ๋
FILE_FORMAT = ( TYPE = PARQUET USE_VECTORIZED_SCANNER = TRUE)
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.MATCH_BY_COLUMN_NAME
์ต์ ์CASE_SENSITIVE
๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
๋ค์ ์ต์ ์
LOAD_MODE = ADD_FILES_COPY
๋ฅผ ์ฌ์ฉํ ๋ ์ง์๋์ง ์์ต๋๋ค.ํด๋ผ์ฐ๋ ์ ์ฅ์ ์์น๋ฅผ ์ง์ ํ๊ณ ์ ์ฅ์ ํตํฉ์ ์ง์ ํ์ฌ ์คํ ์ด์ง๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌ๋ณธ์ผ๋ก ๋ง๋ญ๋๋ค.
FILE_FORMAT = ( TYPE = PARQUET USE_VECTORIZED_SCANNER = TRUE)
์ด์ธ์ ๋ชจ๋ ํ์ผ ํ์ ๊ตฌ์ฑ.MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE | NONE
.ON_ERROR = CONTINUE | SKIP_FILE_N | SKIP_FILE_X%
.VALIDATION_MODE
.๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ธฐ ์ ์ ๋ฐ์ดํฐ ๋ณํ ๋๋ ํํฐ๋งํ๊ธฐ. ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ค๋ฉด FULL_INGEST ์ต์ ์ ๋์ ์ฌ์ฉํ์ญ์์ค.
Snowpipe๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ก๋ฉํ๊ธฐ.
ADD_FILES_COPY
์ ๊ฒฝ์ฐ ๋ ํฐ ์จ์ดํ์ฐ์ค๋ฅผ ์ฌ์ฉํด๋ COPY ์ฟผ๋ฆฌ ๊ธฐ๊ฐ์ด ํฌ๊ฒ ์ค์ด๋ค์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ COPY ์์ ์์๋ ํด๋ผ์ฐ๋ ์๋น์ค ์ปดํจํ ๋ฆฌ์์ค๋ฅผ ํ์ฉํฉ๋๋ค.
์ ์ฅ์ ํตํฉ์ ์ฌ์ฉํ๋ ์ธ๋ถ ์คํ ์ด์ง์์ ์ด ๋ช ๋ น์ ์คํํ๋ ค๋ฉด ์ ์ฅ์ ํตํฉ์ ๋ํ USAGE ๊ถํ์ด ์๊ฑฐ๋ ์ด๋ฅผ ์์๋ฐ์ ์ญํ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์คํ ์ด์ง ๊ถํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์์๋ฐ์ด๋ ๋น๊ณต๊ฐ ์ฐ๊ฒฐ ์ ๊ฒฝ์ฐ ์ธ๋ถ ์์น(์ธ๋ถ ์ ์ฅ์ URI)์์ ์ง์ ๋ก๋ฉํ๋ ๊ธฐ๋ฅ์ ์ง์๋์ง ์์ต๋๋ค. ๋์ ์์๋ฐ์ด๋ ๋น๊ณต๊ฐ ์ฐ๊ฒฐ์ ์ํด ๊ตฌ์ฑ๋ ์ ์ฅ์ ํตํฉ์ด ์๋ ์ธ๋ถ ์คํ ์ด์ง๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ถ๋ ฅยถ
์ด ๋ช ๋ น์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ฐํํฉ๋๋ค.
์ด ์ด๋ฆ |
๋ฐ์ดํฐ ํ์ |
์ค๋ช |
---|---|---|
FILE |
TEXT |
์๋ณธ ํ์ผ์ ์ด๋ฆ๊ณผ ํ์ผ์ ์๋ ๊ฒฝ๋ก |
STATUS |
TEXT |
์ํ: ๋ก๋ฉ๋จ, ๋ก๋ฉ ์คํจ ๋๋ ์ผ๋ถ ๋ก๋ฉ๋จ |
ROWS_PARSED |
NUMBER |
์์ค ํ์ผ์์ ๊ตฌ๋ถ ๋ถ์๋ ํ ์ |
ROWS_LOADED |
NUMBER |
์์ค ํ์ผ์์ ๋ก๋ฉ๋ ํ ์ |
ERROR_LIMIT |
NUMBER |
์ค๋ฅ ์๊ฐ ์ด ํ๊ณ์ ๋๋ฌํ๋ฉด ์ค๋จํจ |
ERRORS_SEEN |
NUMBER |
์์ค ํ์ผ์ ์๋ ์ค๋ฅ ํ์ ์ |
FIRST_ERROR |
TEXT |
์์ค ํ์ผ์ ์ฒซ ๋ฒ์งธ ์ค๋ฅ |
FIRST_ERROR_LINE |
NUMBER |
์ฒซ ๋ฒ์งธ ์ค๋ฅ์ ์ค ๋ฒํธ |
FIRST_ERROR_CHARACTER |
NUMBER |
์ฒซ ๋ฒ์งธ ์ค๋ฅ ๋ฌธ์์ ์์น |
FIRST_ERROR_COLUMN_NAME |
TEXT |
์ฒซ ๋ฒ์งธ ์ค๋ฅ์ ์ด ์ด๋ฆ |
์ยถ
๋ฐ์ดํฐ ๋ก๋ฉ ๋ณํ์ ์๋ ๋ก๋ ์ค ๋ฐ์ดํฐ ๋ณํํ๊ธฐ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ด๋ถ ์คํ ์ด์ง์์ ํ์ผ ๋ก๋ฉํ๊ธฐยถ
์ฐธ๊ณ
์ด๋ฌํ ์์์๋ PUT ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ด์ ์คํ ์ด์ง๋ก ๋ณต์ฌํ ๊ฒ์ผ๋ก ๊ฐ์ ํฉ๋๋ค.
๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง์์ ํ ์ด๋ธ๋ก ํ์ผ ๋ก๋ฉ:
COPY INTO mytable FROM @my_int_stage;
ํ ์ด๋ธ์ ์คํ ์ด์ง์์ ํ ์ด๋ธ๋ก ํ์ผ ๋ก๋ฉ:
COPY INTO mytable FILE_FORMAT = (TYPE = CSV);์ฐธ๊ณ
ํ ์ด๋ธ ์์น์ ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ๋, Snowflake๊ฐ ํ ์ด๋ธ ์์น์ ์๋ ํ์ผ์ ์๋์ผ๋ก ๊ฒ์ฌํ๋ฏ๋ก FROM ์ ์ ์๋ตํ ์ ์์ต๋๋ค.
์ฌ์ฉ์์ ๊ฐ์ธ ์คํ ์ด์ง์์ ํ ์ด๋ธ๋ก ํ์ผ ๋ก๋ฉ:
COPY INTO mytable from @~/staged FILE_FORMAT = (FORMAT_NAME = 'mycsv');
๋ช ๋ช ๋ ์ธ๋ถ ์คํ ์ด์ง์์ ํ์ผ ๋ก๋ฉํ๊ธฐยถ
CREATE STAGE ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ด์ ์ ๋ง๋ค์ด ๋ช ๋ช ํ ์ธ๋ถ ์คํ ์ด์ง์์ ํ์ผ์ ๋ก๋ฉํฉ๋๋ค. ๋ช ๋ช ๋ ์ธ๋ถ ์คํ ์ด์ง๋ ์ธ๋ถ ์์น(Amazon S3, Google Cloud Storage ๋๋ Microsoft Azure)๋ฅผ ์ฐธ์กฐํ๊ณ ์ด ์์น์ ์ก์ธ์คํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์๊ฒฉ ์ฆ๋ช ๊ณผ ๊ธฐํ ์ธ๋ถ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
COPY INTO mycsvtable FROM @my_ext_stage/tutorials/dataloading/contacts1.csv;
์ด ์ผ์น๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ๋ก๋ฉํ๊ธฐยถ
๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ํ์ผ์ ์ด ์ด๋ฆ์ ํ
์ด๋ธ์ ์ ์๋ ์ด ์ด๋ฆ๊ณผ ์ผ์น์์ผ MATCH_BY_COLUMN_NAME
๋ณต์ฌ ์ต์
์ผ๋ก ๋ช
๋ช
๋ ์ธ๋ถ ์คํ
์ด์ง์์ ํ
์ด๋ธ๋ก ํ์ผ์ ๋ก๋ํฉ๋๋ค. ์ด ์ต์
์์๋ ํ์ผ์ ์ด ์์๊ฐ ํ
์ด๋ธ์ ์ด ์์์ ์ผ์นํ์ง ์์๋ ๋ฉ๋๋ค.
COPY INTO mytable FROM @my_ext_stage/tutorials/dataloading/sales.json.gz FILE_FORMAT = (TYPE = 'JSON') MATCH_BY_COLUMN_NAME='CASE_INSENSITIVE';
์ธ๋ถ ์์น์์ ์ง์ ํ์ผ ๋ก๋ฉํ๊ธฐยถ
์ฐธ๊ณ
์ด ์ต์ ์ ์์๋ฐ์ด๋ ๋น๊ณต๊ฐ ์ฐ๊ฒฐ ์ ๋ํด์๋ ์ง์๋์ง ์์ต๋๋ค. ๋์ ์ธ๋ถ ์คํ ์ด์ง๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๋ค์ ์์์๋ ๋ช
๋ช
๋ my_csv_format
ํ์ผ ํ์์ ์ฌ์ฉํ์ฌ ์ ์ฅ์ ์์น(Amazon S3, Google Cloud Storage ๋๋ Microsoft Azure)์์ data/files
์ ๋์ฌ๊ฐ ๋ถ์ ๋ชจ๋ ํ์ผ์ ๋ก๋ฉํฉ๋๋ค.
Amazon S3
์ด๋ฆ์ด
myint
์ธ ์ฐธ์กฐ๋ ์ ์ฅ์ ํตํฉ์ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ๋ S3 ๋ฒํท์ ์ก์ธ์คํฉ๋๋ค. ๋ ์์ ์์ ๋ชจ๋MASTER_KEY
๊ฐ์ด ์๋ฆฐ๋ค๋ ์ ์ ์ ์ํ์ญ์์ค.COPY INTO mytable FROM s3://mybucket/data/files STORAGE_INTEGRATION = myint ENCRYPTION=(MASTER_KEY = 'eSx...') FILE_FORMAT = (FORMAT_NAME = my_csv_format);์ ๊ณต๋ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ๋ S3 ๋ฒํท์ ์ก์ธ์ค:
COPY INTO mytable FROM s3://mybucket/data/files CREDENTIALS=(AWS_KEY_ID='$AWS_ACCESS_KEY_ID' AWS_SECRET_KEY='$AWS_SECRET_ACCESS_KEY') ENCRYPTION=(MASTER_KEY = 'eSx...') FILE_FORMAT = (FORMAT_NAME = my_csv_format);
Google Cloud Storage
์ด๋ฆ์ด
myint
์ธ ์ฐธ์กฐ๋ ์ ์ฅ์ ํตํฉ์ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ๋ GCS ๋ฒํท์ ์ก์ธ์ค:COPY INTO mytable FROM 'gcs://mybucket/data/files' STORAGE_INTEGRATION = myint FILE_FORMAT = (FORMAT_NAME = my_csv_format);
Microsoft Azure
์ด๋ฆ์ด
myint
์ธ ์ฐธ์กฐ๋ ์ ์ฅ์ ํตํฉ์ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ๋ ์ปจํ ์ด๋์ ์ก์ธ์คํฉ๋๋ค. ๋ ์์ ์์ ๋ชจ๋MASTER_KEY
๊ฐ์ด ์๋ฆฐ๋ค๋ ์ ์ ์ ์ํ์ญ์์ค.COPY INTO mytable FROM 'azure://myaccount.blob.core.windows.net/data/files' STORAGE_INTEGRATION = myint ENCRYPTION=(TYPE='AZURE_CSE' MASTER_KEY = 'kPx...') FILE_FORMAT = (FORMAT_NAME = my_csv_format);์ ๊ณต๋ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ๋ ์ปจํ ์ด๋์ ์ก์ธ์ค:
COPY INTO mytable FROM 'azure://myaccount.blob.core.windows.net/mycontainer/data/files' CREDENTIALS=(AZURE_SAS_TOKEN='?sv=2016-05-31&ss=b&srt=sco&sp=rwdl&se=2018-06-27T10:05:50Z&st=2017-06-27T02:05:50Z&spr=https,http&sig=bgqQwoXwxzuD2GJfagRg7VOS8hzNr3QLT7rhS8OFRLQ%3D') ENCRYPTION=(TYPE='AZURE_CSE' MASTER_KEY = 'kPx...') FILE_FORMAT = (FORMAT_NAME = my_csv_format);
ํจํด ์ผ์น๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ฉํ๊ธฐยถ
์์์ ๊ฒฝ๋ก์์ ์์ถ๋ CSV ํ์ผ์ ๋ฐ์ดํฐ๋ง ๋ก๋ฉํ๊ธฐ ์ํ ํจํด ์ผ์น๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ์ ์คํ ์ด์ง์์ ํ ์ด๋ธ๋ก ํ์ผ์ ๋ก๋ฉํฉ๋๋ค.
COPY INTO mytable FILE_FORMAT = (TYPE = 'CSV') PATTERN='.*/.*/.*[.]csv[.]gz';
์ฌ๊ธฐ์ .*
๋ โ์์์ ๋ฌธ์ 0ํ ๋๋ ๊ทธ ์ด์ ๋ฐ์โ์ผ๋ก ํด์๋ฉ๋๋ค. ๋๊ดํธ๋ ํ์ผ ํ์ฅ๋ช
์์ ์๋ ๋ง์นจํ ๋ฌธ์(.
)๋ฅผ ์ด์ค์ผ์ดํํฉ๋๋ค.
์ด๋ฆ์ ๋ฌธ์์ด sales
๊ฐ ํฌํจ๋ ์์ถ๋์ง ์์ CSV ํ์ผ๋ง ๋ก๋ฉํ๋ ค๋ฉด ํจํด ์ผ์น๋ฅผ ์ฌ์ฉํ์ฌ ํ
์ด๋ธ ์คํ
์ด์ง์์ ํ
์ด๋ธ๋ก ํ์ผ์ ๋ก๋ฉํ์ญ์์ค.
COPY INTO mytable FILE_FORMAT = (FORMAT_NAME = myformat) PATTERN='.*sales.*[.]csv';
VARIANT ์ด๋ก JSON ๋ฐ์ดํฐ ๋ก๋ฉํ๊ธฐยถ
๋ค์ ์์์๋ VARIANT ํ์์ ๋จ์ผ ์ด์ด ์๋ ํ ์ด๋ธ๋ก JSON ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํฉ๋๋ค.
์คํ ์ด์ง ์ํ JSON ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ด ์ค ๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ๋๋ ์ธ ์ค๋ธ์ ํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
[{ "location": { "city": "Lexington", "zip": "40503", }, "sq__ft": "1000", "sale_date": "4-25-16", "price": "75836" }, { "location": { "city": "Belmont", "zip": "02478", }, "sq__ft": "1103", "sale_date": "6-18-16", "price": "92567" } { "location": { "city": "Winchester", "zip": "01890", }, "sq__ft": "1122", "sale_date": "1-31-16", "price": "89921" }]/* Create a JSON file format that strips the outer array. */ CREATE OR REPLACE FILE FORMAT json_format TYPE = 'JSON' STRIP_OUTER_ARRAY = TRUE; /* Create an internal stage that references the JSON file format. */ CREATE OR REPLACE STAGE mystage FILE_FORMAT = json_format; /* Stage the JSON file. */ PUT file:///tmp/sales.json @mystage AUTO_COMPRESS=TRUE; /* Create a target table for the JSON data. */ CREATE OR REPLACE TABLE house_sales (src VARIANT); /* Copy the JSON data into the target table. */ COPY INTO house_sales FROM @mystage/sales.json.gz; SELECT * FROM house_sales; +---------------------------+ | SRC | |---------------------------| | { | | "location": { | | "city": "Lexington", | | "zip": "40503" | | }, | | "price": "75836", | | "sale_date": "4-25-16", | | "sq__ft": "1000", | | "type": "Residential" | | } | | { | | "location": { | | "city": "Belmont", | | "zip": "02478" | | }, | | "price": "92567", | | "sale_date": "6-18-16", | | "sq__ft": "1103", | | "type": "Residential" | | } | | { | | "location": { | | "city": "Winchester", | | "zip": "01890" | | }, | | "price": "89921", | | "sale_date": "1-31-16", | | "sq__ft": "1122", | | "type": "Condo" | | } | +---------------------------+
ํ์ผ ๋ค์ ๋ก๋ฉํ๊ธฐยถ
๋ณ๊ฒฝ๋์ง ์์(์ฆ, ์ฒ์ ๋ก๋ฉ๋์์ ๋์ ๊ฐ์ ์ฒดํฌ์ฌ์ ๊ฐ์ง) ์คํ
์ด์ง ์ํ ๋ฐ์ดํฐ ํ์ผ ์ธํธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ก๋ฉ(๋ณต์ )ํ๋ ค๋ฉด COPY ๋ช
๋ น์ FORCE = TRUE
๋ฅผ ์ถ๊ฐํ์ญ์์ค.
๋ค์ ์์์, ์ฒซ ๋ฒ์งธ ๋ช ๋ น์ ์ง์ ๋ ํ์ผ์ ๋ก๋ฉํ๊ณ ๋ ๋ฒ์งธ ๋ช ๋ น์ ํ์ผ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์ง ์์๋๋ผ๋ ๋๊ฐ์ ํ์ผ์ ๊ฐ์ ๋ก ๋ค์ ๋ก๋ฉํฉ๋๋ค(์ค๋ณต ํ ์์ฑ).
COPY INTO load1 FROM @%load1/data1/ FILES=('test1.csv', 'test2.csv'); COPY INTO load1 FROM @%load1/data1/ FILES=('test1.csv', 'test2.csv') FORCE=TRUE;
๋ก๋ฉ ํ ํ์ผ ์ ๊ฑฐํ๊ธฐยถ
ํ ์ด๋ธ์ ์คํ ์ด์ง์์ ํ ์ด๋ธ๋ก ํ์ผ์ ๋ก๋ฉํ๊ณ ๋ก๋ฉ ํ ํ์ผ์ ์ ๊ฑฐํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, COPY๋ ์ด ์์น์์ ๋ก๋ฉ๋ ํ์ผ์ ์ ๊ฑฐํ์ง ์์ต๋๋ค. ๋ก๋ฉ ํ ํ์ผ์ ์ ๊ฑฐํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
๊ณ์ ์ ํ์ผ์ด ์ ์ฅ๋ ๋ฒํท ๋๋ ์ปจํ ์ด๋์ ๋ํ ์ฐ๊ธฐ ๊ถํ์ด ์๋์ง ํ์ธํ์ญ์์ค.
๋ก๋ฉ ํ ํ ์ด๋ธ์ ์ฑ๊ณต์ ์ผ๋ก ๋ก๋ฉ๋ ๋ชจ๋ ํ์ผ์ ์ ๊ฑฐํ๋๋ก ์ง์ ํ๋ ค๋ฉด ํ ์ด๋ธ์ ๋ํด
PURGE=TRUE
๋ฅผ ์ค์ ํ์ญ์์ค.ALTER TABLE mytable SET STAGE_COPY_OPTIONS = (PURGE = TRUE); COPY INTO mytable;
COPY ๋ช ๋ น์์ ์ง์ ๋ณต์ฌ ์ต์ ์ ์ฌ์ ์ํ ์๋ ์์ต๋๋ค.
COPY INTO mytable PURGE = TRUE;
ํ์ผ์ด ํ ์ด๋ธ์ ๋ก๋ฉ๋ ํ์๋ ํ์ผ์ด ์ ์ฅ๋ ๋ฒํท ๋๋ ์ปจํ ์ด๋์์ ํ์ผ์ด ์ญ์ ๋ฉ๋๋ค. ํ์ผ์ด ์ญ์ ํ๋ก์ธ์ค๋ฅผ ์์ํ ํ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ทจ์ํ ์ ์์ต๋๋ค.
์คํ ์ด์ง๋ ํ์ผ ์ ํจ์ฑ ๊ฒ์ฌํ๊ธฐยถ
๋ก๋ฉํ์ง ์๊ณ ์คํ ์ด์ง์์ ํ์ผ ์ ํจ์ฑ ๊ฒ์ฌ:
์ ํจ์ฑ ๊ฒ์ฌ ๋ชจ๋์์ COPY ๋ช ๋ น์ ์คํํ๊ณ ๋ชจ๋ ์ค๋ฅ๋ฅผ ํ์ธํฉ๋๋ค.
COPY INTO mytable VALIDATION_MODE = 'RETURN_ERRORS'; +-------------------------------------------------------------------------------------------------------------------------------+------------------------+------+-----------+-------------+----------+--------+-----------+----------------------+------------+----------------+ | ERROR | FILE | LINE | CHARACTER | BYTE_OFFSET | CATEGORY | CODE | SQL_STATE | COLUMN_NAME | ROW_NUMBER | ROW_START_LINE | +-------------------------------------------------------------------------------------------------------------------------------+------------------------+------+-----------+-------------+----------+--------+-----------+----------------------+------------+----------------+ | Field delimiter ',' found while expecting record delimiter '\n' | @MYTABLE/data1.csv.gz | 3 | 21 | 76 | parsing | 100016 | 22000 | "MYTABLE"["QUOTA":3] | 3 | 3 | | NULL result in a non-nullable column. Use quotes if an empty field should be interpreted as an empty string instead of a null | @MYTABLE/data3.csv.gz | 3 | 2 | 62 | parsing | 100088 | 22000 | "MYTABLE"["NAME":1] | 3 | 3 | | End of record reached while expected to parse column '"MYTABLE"["QUOTA":3]' | @MYTABLE/data3.csv.gz | 4 | 20 | 96 | parsing | 100068 | 22000 | "MYTABLE"["QUOTA":3] | 4 | 4 | +-------------------------------------------------------------------------------------------------------------------------------+------------------------+------+-----------+-------------+----------+--------+-----------+----------------------+------------+----------------+
์ง์ ๋ ํ ์์ ๋ํด ์ ํจ์ฑ ๊ฒ์ฌ ๋ชจ๋์์ COPY ๋ช ๋ น์ ์คํํฉ๋๋ค. ์ด ์์์๋ ์ฒ์ ์คํํ ๋ ์ง์ ๋ ํ ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ณ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ด ํ ์ด๋ธ์ ๋ก๋ฉ๋ ๋ ๋ํ๋ ์ ๋ณด๋ฅผ ํ์ํฉ๋๋ค. ๋ ๋ฒ์งธ๋ก ์คํํ๋ฉด ์ง์ ๋ ํ ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ๋ค์ ์ค๋ฅ์ ํจ๊ป ์คํจํฉ๋๋ค.
COPY INTO mytable VALIDATION_MODE = 'RETURN_2_ROWS'; +--------------------+----------+-------+ | NAME | ID | QUOTA | +--------------------+----------+-------+ | Joe Smith | 456111 | 0 | | Tom Jones | 111111 | 3400 | +--------------------+----------+-------+ COPY INTO mytable VALIDATION_MODE = 'RETURN_3_ROWS'; FAILURE: NULL result in a non-nullable column. Use quotes if an empty field should be interpreted as an empty string instead of a null File '@MYTABLE/data3.csv.gz', line 3, character 2 Row 3, column "MYTABLE"["NAME":1]
Iceberg์ ํธํ๋๋ Parquet ๋ฐ์ดํฐ๋ฅผ Iceberg ํ ์ด๋ธ์ ๋ก๋ํ๊ธฐยถ
์ด ์์ ์์๋ Iceberg ํ ์ด๋ธ์ ์์ฑํ ๋ค์ ์ธ๋ถ ์คํ ์ด์ง์ Iceberg ํธํ Parquet ๋ฐ์ดํฐ ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
๋ฐ๋ชจ ๋ชฉ์ ์ผ๋ก ์ด ์์ ์์๋ ๋ค์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
iceberg_ingest_vol
์ด๋ผ๋ ์ธ๋ถ ๋ณผ๋ฅจ. ์ธ๋ถ ๋ณผ๋ฅจ์ ์์ฑํ๋ ค๋ฉด ์ธ๋ถ ๋ณผ๋ฅจ ๊ตฌ์ฑ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.my_parquet_stage
๋ผ๋ ์ธ๋ถ ์คํ ์ด์ง์ Iceberg์ ํธํ๋๋ Parquet ํ์ผ์ด ์์ต๋๋ค. ์ธ๋ถ ์คํ ์ด์ง๋ฅผ ์์ฑํ๋ ค๋ฉด CREATE STAGE ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Iceberg ํธํ Parquet ๋ฐ์ดํฐ(
TYPE = PARQUET USE_VECTORIZED_SCANNER = TRUE
)๋ฅผ ๋ณต์ฌํ๋ ๋ฐ ํ์ํ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ์คํ ์ด์ง๋ Parquet ํ์ผ์ ์ค๋ช ํ๋ ํ์ผ ํ์ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ญ๋๋ค.CREATE OR REPLACE FILE FORMAT my_parquet_format TYPE = PARQUET USE_VECTORIZED_SCANNER = TRUE;
์๋ณธ Parquet ํ์ผ ๋ฐ์ดํฐ ํ์ ๊ณผ ํธํ๋๋ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์ด์ ์ ์ํ์ฌ Snowflake ๊ด๋ฆฌํ Iceberg ํ ์ด๋ธ์ ๋ง๋ญ๋๋ค.
CREATE OR REPLACE ICEBERG TABLE customer_iceberg_ingest ( c_custkey INTEGER, c_name STRING, c_address STRING, c_nationkey INTEGER, c_phone STRING, c_acctbal INTEGER, c_mktsegment STRING, c_comment STRING ) CATALOG = 'SNOWFLAKE' EXTERNAL_VOLUME = 'iceberg_ingest_vol' BASE_LOCATION = 'customer_iceberg_ingest/';
์ฐธ๊ณ
์์ ๋ฌธ์ Snowflake ๋ฐ์ดํฐ ํ์ ์ ๋งคํ๋๋ Iceberg ๋ฐ์ดํฐ ํ์ ์ ์ง์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Apache Icebergโข ํ ์ด๋ธ์ ๋ฐ์ดํฐ ํ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
COPY INTO ๋ฌธ์ ์ฌ์ฉํ์ฌ ์คํ ์ด์ง๋ Parquet ํ์ผ(URL ๊ฒฝ๋ก ๋ฐ๋ก ์๋์ ์์น)์ ๋ฐ์ดํฐ๋ฅผ Iceberg ํ ์ด๋ธ๋ก ๋ก๋ํฉ๋๋ค.
COPY INTO customer_iceberg_ingest FROM @my_parquet_stage FILE_FORMAT = 'my_parquet_format' LOAD_MODE = ADD_FILES_COPY PURGE = TRUE MATCH_BY_COLUMN_NAME = CASE_SENSITIVE;
์ฐธ๊ณ
์ด ์์ ์์๋
LOAD_MODE = ADD_FILES_COPY
๋ฅผ ์ง์ ํ์ฌ Snowflake๊ฐ ํ์ผ์ ์ธ๋ถ ๋ณผ๋ฅจ ์์น์ ๋ณต์ฌ๋ณธ์ผ๋ก ๋ณต์ฌํ ๋ค์ ํ์ผ์ ํ ์ด๋ธ์ ๋ฑ๋กํ๋๋ก ์ง์ํฉ๋๋ค.์ด ์ ํ ์ฌํญ์ ์๋ณธ Parquet ํ์ผ์ ์ค์บํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ Parquet ํ์ผ๋ก ๋ค์ ์์ฑํ์ง ์์ผ๋ฏ๋ก ํ์ผ ์๊ธ์ ํผํ ์ ์์ต๋๋ค.
์ถ๋ ฅ:
+---------------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+ | file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name | |---------------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------| | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_008.parquet | LOADED | 15000 | 15000 | 0 | 0 | NULL | NULL | NULL | NULL | | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_006.parquet | LOADED | 15000 | 15000 | 0 | 0 | NULL | NULL | NULL | NULL | | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_005.parquet | LOADED | 15000 | 15000 | 0 | 0 | NULL | NULL | NULL | NULL | | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_002.parquet | LOADED | 5 | 5 | 0 | 0 | NULL | NULL | NULL | NULL | | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_010.parquet | LOADED | 15000 | 15000 | 0 | 0 | NULL | NULL | NULL | NULL | +---------------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
ํ ์ด๋ธ์ ์ฟผ๋ฆฌํฉ๋๋ค.
SELECT c_custkey, c_name, c_mktsegment FROM customer_iceberg_ingest LIMIT 10;
์ถ๋ ฅ:
+-----------+--------------------+--------------+ | C_CUSTKEY | C_NAME | C_MKTSEGMENT | |-----------+--------------------+--------------| | 75001 | Customer#000075001 | FURNITURE | | 75002 | Customer#000075002 | FURNITURE | | 75003 | Customer#000075003 | MACHINERY | | 75004 | Customer#000075004 | AUTOMOBILE | | 75005 | Customer#000075005 | FURNITURE | | 1 | Customer#000000001 | BUILDING | | 2 | Customer#000000002 | AUTOMOBILE | | 3 | Customer#000000003 | AUTOMOBILE | | 4 | Customer#000000004 | MACHINERY | | 5 | Customer#000000005 | HOUSEHOLD | +-----------+--------------------+--------------+