SnowConvert AI - BigQuery - CREATE TABLE¶
문법 구문¶
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] TABLE [ IF NOT EXISTS ]
table_name
[(
column | constraint_definition[, ...]
)]
[DEFAULT COLLATE collate_specification]
[PARTITION BY partition_expression]
[CLUSTER BY clustering_column_list]
[OPTIONS(table_option_list)]
[AS query_statement]
샘플 소스 패턴¶
DEFAULT COLLATE¶
BigQuery¶
CREATE TABLE table1 (
col1 STRING
)
DEFAULT COLLATE 'und:ci';
Snowflake¶
CREATE TABLE table1 (
col1 STRING
)
DEFAULT_DDL_COLLATION='und-ci';
레이블 테이블 옵션¶
BigQuery¶
CREATE TABLE table1
(
col1 INT,
col2 DATE
)
OPTIONS(
labels=[("org_unit", "development")]
);
Snowflake¶
CREATE TAG IF NOT EXISTS "org_unit";
CREATE TABLE table1
(
col1 INT,
col2 DATE
)
WITH TAG( "org_unit" = "development" )
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "bigquery", "convertedOn": "04/09/2025", "domain": "test" }}'
;
설명 테이블 옵션¶
BigQuery¶
CREATE TABLE table1
(
col1 INT,
col2 DATE
)
OPTIONS(
description = 'My table comment'
);
Snowflake¶
CREATE TABLE table1
(
col1 INT,
col2 DATE
)
COMMENT = '{ "description": "My table comment", "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "bigquery", "convertedOn": "04/09/2025", "domain": "test" }}'
;
설명 테이블 옵션¶
BigQuery¶
CREATE TABLE table1
(
col1 INT,
col2 DATE
)
OPTIONS(
friendly_name = 'Some_table'
);
Snowflake¶
CREATE TABLE table1
(
col1 INT,
col2 DATE
)
COMMENT = '{ "friendly_name": "Some_table", "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "bigquery", "convertedOn": "04/09/2025", "domain": "test" }}'
;
Known Issues¶
1. 지원되지 않는 테이블 옵션
Snowflake에서 모든 테이블 옵션이 지원되는 것은 아닙니다. OPTIONS 절에서 지원되지 않는 테이블 옵션이 발견되는 경우 이에 대해 경고하기 위해 EWI가 생성됩니다.
BigQuery¶
CREATE TABLE table1
(
col1 INT,
col2 DATE
)
OPTIONS(
expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC",
partition_expiration_days=1,
description="a table that expires in 2025, with each partition living for 24 hours",
labels=[("org_unit", "development")]
);
Snowflake¶
CREATE TAG IF NOT EXISTS "org_unit";
CREATE TABLE table1
(
col1 INT,
col2 DATE
)
WITH TAG( "org_unit" = "development" )
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0001 - SNOWFLAKE DOES NOT SUPPORT THE OPTIONS: EXPIRATION_TIMESTAMP, PARTITION_EXPIRATION_DAYS. ***/!!!
OPTIONS(
expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC",
partition_expiration_days=1
)
COMMENT = '{ "description": "a table that expires in 2025, with each partition living for 24 hours", "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "bigquery", "convertedOn": "04/09/2025", "domain": "test" }}'
;
2. 마이크로 분할은 Snowflake에서 자동으로 관리됨
Snowflake는 데이터의 자동 분할을 수행합니다. 사용자 정의 분할은 지원되지 않습니다.
BigQuery¶
CREATE TABLE table1(
transaction_id INT,
transaction_date DATE
)
PARTITION BY transaction_date;
Snowflake¶
CREATE TABLE table1 (
transaction_id INT,
transaction_date DATE
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0002 - MICRO-PARTITIONING IS AUTOMATICALLY PERFORMED ON ALL SNOWFLAKE TABLES. ***/!!!
PARTITION BY transaction_date;
COLUMN DEFINITION¶
문법 구문¶
column :=
column_name column_schema
column_schema :=
{
simple_type
| STRUCT<field_list>
| ARRAY<array_element_schema>
}
[PRIMARY KEY NOT ENFORCED | REFERENCES table_name(column_name) NOT ENFORCED]
[DEFAULT default_expression]
[NOT NULL]
[OPTIONS(column_option_list)]
simple_type :=
{ data_type | STRING COLLATE collate_specification }
field_list :=
field_name column_schema [, ...]
array_element_schema :=
{ simple_type | STRUCT<field_list> }
[NOT NULL]
샘플 소스 패턴¶
설명 옵션¶
BigQuery¶
CREATE TABLE table1 (
col1 VARCHAR(20) OPTIONS(description="A repeated STRING field")
);
Snowflake¶
CREATE TABLE table1 (
col1 VARCHAR(20) COMMENT = 'A repeated STRING field'
);
COLLATE¶
BigQuery¶
CREATE TABLE table1 (
col1 STRING COLLATE 'und:ci'
);
Snowflake¶
CREATE TABLE table1 (
col1 STRING COLLATE 'und-ci'
);
Known Issues¶
1. 반올림 모드가 지원되지 않음
Snowflake는 열에 기본 반올림 모드 지정을 지원하지 않습니다.
BigQuery¶
CREATE TABLE table1 (
col1 STRING OPTIONS(rounding_mode = "ROUND_HALF_EVEN")
);
Snowflake¶
CREATE TABLE table1 (
col1 STRING
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0001 - SNOWFLAKE DOES NOT SUPPORT THE OPTIONS: ROUNDING_MODE. ***/!!!
OPTIONS(
rounding_mode = "ROUND_HALF_EVEN"
)
)
관련 EWIs¶
SSC-EWI-BQ0001: Snowflake는 options 절을 지원하지 않습니다.
CREATE EXTERNAL TABLE¶
설명¶
외부 테이블을 사용하면 BigQuery가 BigQuery 저장소 외부에 저장된 데이터를 쿼리할 수 있습니다.(BigQuery SQL 언어 참조 CREATE EXTERNAL TABLE)
구문
CREATE [ OR REPLACE ] EXTERNAL TABLE [ IF NOT EXISTS ] table_name
[(
column_name column_schema,
...
)]
[WITH CONNECTION {connection_name | DEFAULT}]
[WITH PARTITION COLUMNS
[(
partition_column_name partition_column_type,
...
)]
]
OPTIONS (
external_table_option_list,
...
);
BigQuery의 CREATE EXTERNAL TABLE 문이 Snowflake에서 CREATE EXTERNAL TABLE 문으로 변환됩니다. 그러나 이 변환에는 사용자 개입이 필요합니다.
SnowConvert AI에서 수행된 변환을 완료하려면 파일이 있는 외부 소스에 대해 액세스 권한이 있는 저장소 통합, 외부 스테이지 및 (선택 사항) 알림 통합을 정의해야 합니다. 각 공급자에 대한 연결을 설정하는 방법은 다음 가이드를 참조하세요.
이 페이지에 표시된 변환에 대한 중요한 고려 사항은 다음과 같습니다.
@EXTERNAL_STAGE 자리 표시자는 이전 가이드에 따라 생성된 외부 스테이지로 바꿔야 합니다.
외부 스테이지는 버킷의 루트를 가리키는 것으로 간주됩니다. 각 테이블에 대해 생성된 PATTERN 절은 버킷 맨 아래에서 시작하는 파일/폴더 경로를 지정하므로 버킷의 다른 위치를 가리키는 외부 스테이지를 정의하면 원치 않는 동작이 발생할 수 있다는 점을 고려하는 것이 중요합니다.
오류를 방지하기 위해
AUTO_REFRESH = FALSE절이 생성됩니다. 외부 테이블 메타데이터의 자동 새로 고침은 Snowflake 계정 클라우드 공급자와 버킷 공급자가 동일하고 알림 통합이 생성된 경우에만 유효합니다.
샘플 소스 패턴¶
명시적 열 목록이 있는 CREATE EXTERNAL TABLE¶
열 목록이 제공되면 SnowConvert AI는 파일 값을 추출하기 위해 각 열에 대한 AS 표현식 열 옵션을 자동으로 생성합니다.
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.Employees_test
(
Employee_id INTEGER,
Name STRING,
Mail STRING,
Position STRING,
Salary INTEGER
)
OPTIONS(
FORMAT='CSV',
SKIP_LEADING_ROWS=1,
URIS=['gs://sc_external_table_bucket/folder_with_csv/Employees.csv']
);
Snowflake¶
CREATE OR REPLACE EXTERNAL TABLE test.Employees_test
(
Employee_id INTEGER AS CAST(GET_IGNORE_CASE($1, 'c1') AS INTEGER),
Name STRING AS CAST(GET_IGNORE_CASE($1, 'c2') AS STRING),
Mail STRING AS CAST(GET_IGNORE_CASE($1, 'c3') AS STRING),
Position STRING AS CAST(GET_IGNORE_CASE($1, 'c4') AS STRING),
Salary INTEGER AS CAST(GET_IGNORE_CASE($1, 'c5') AS INTEGER)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_csv/Employees.csv'
FILE_FORMAT = (TYPE = CSV SKIP_HEADER =1);
명시적 열 목록이 없는 CREATE EXTERNAL TABLE¶
열 목록이 제공되지 않는 경우, BigQuery는 파일 구조에서 열의 스키마를 자동으로 감지합니다. 이 동작을 복제하기 위해 SnowConvert AI는 INFER_SCHEMA 함수를 사용하여 열 정의를 생성하는 USING TEMPLATE 절을 생성합니다.
INFER_SCHEMA 함수가 작동하려면 파일 형식이 필요하므로, SnowConvert AI는 이를 위해 임시 파일 형식을 생성합니다. 이 파일 형식은 CREATE EXTERNAL TABLE 문를 실행할 때만 필요하며, 세션이 종료되면 자동으로 삭제됩니다.
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json
OPTIONS(
FORMAT='JSON',
URIS=['gs://sc_external_table_bucket/folder_with_json/Cars.jsonl']
);
Snowflake¶
CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_MY_EXTERNAL_TABLE_JSON_FORMAT
TYPE = JSON;
CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json USING TEMPLATE (
SELECT
ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/folder_with_json/Cars.jsonl', FILE_FORMAT => 'SC_TEST_MY_EXTERNAL_TABLE_JSON_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_json/Cars.jsonl'
FILE_FORMAT = (TYPE = JSON);
여러 URIs가 있는 CREATE EXTERNAL TABLE¶
여러 소스 URIs가 지정되면 Snowflake의 PATTERN 절 정규식에서 조인되고, 사용된 와일드카드 * 문자는 Snowflake에서 .*와 동등한 항목으로 변환됩니다.
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.multipleFilesTable
(
Name STRING,
Code STRING,
Price NUMERIC,
Expiration_date DATE
)
OPTIONS(
format="CSV",
skip_leading_rows = 1,
uris=['gs://sc_external_table_bucket/folder_with_csv/Food.csv', 'gs://sc_external_table_bucket/folder_with_csv/other_products/*']
);
Snowflake¶
CREATE OR REPLACE EXTERNAL TABLE test.multipleFilesTable
(
Name STRING AS CAST(GET_IGNORE_CASE($1, 'c1') AS STRING),
Code STRING AS CAST(GET_IGNORE_CASE($1, 'c2') AS STRING),
Price NUMERIC AS CAST(GET_IGNORE_CASE($1, 'c3') AS NUMERIC),
Expiration_date DATE AS CAST(GET_IGNORE_CASE($1, 'c4') AS DATE)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_csv/Food.csv|folder_with_csv/other_products/.*'
FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1);
WITH CONNECTION 절¶
WITH CONNECTION 절은 저장소 통합을 사용하여 연결 정보가 Snowflake에 이미 제공되었으므로 제거되었습니다.
BigQuery¶
CREATE EXTERNAL TABLE test.awsTable
WITH CONNECTION `aws-us-east-1.s3-read-connection`
OPTIONS (
format="JSON",
uris=["s3://s3-bucket/json_files/example.jsonl"]
);
Snowflake¶
CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_AWSTABLE_FORMAT
TYPE = JSON;
CREATE EXTERNAL TABLE test.awsTable USING TEMPLATE (
SELECT
ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/json_files/example.jsonl', FILE_FORMAT => 'SC_TEST_AWSTABLE_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS s3://s3-bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'json_files/example.jsonl'
FILE_FORMAT = (TYPE = JSON);
지원되는 테이블 옵션¶
다음 외부 테이블 옵션은 Snowflake에서 지원되며 SnowConvert AI에 의해 변환됩니다.
FORMAT
ENCODING
SKIP_LEADING_ROWS
FIELD_DELIMITER
COMPRESSION
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.songs_test
(
Name STRING,
Release_date INTEGER,
Songs INT,
Genre STRING
)
OPTIONS(
FORMAT='CSV',
ENCODING='UTF-8',
SKIP_LEADING_ROWS=1,
FIELD_DELIMITER='|',
COMPRESSION='GZIP',
URIS=['gs://sc_external_table_bucket/folder_with_csv/Albums.csv']
);
Snowflake¶
CREATE OR REPLACE EXTERNAL TABLE test.songs_test
(
Name STRING AS CAST(GET_IGNORE_CASE($1, 'c1') AS STRING),
Release_date INTEGER AS CAST(GET_IGNORE_CASE($1, 'c2') AS INTEGER),
Songs INT AS CAST(GET_IGNORE_CASE($1, 'c3') AS INT),
Genre STRING AS CAST(GET_IGNORE_CASE($1, 'c4') AS STRING)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_csv/Albums.csv'
FILE_FORMAT = (TYPE = CSV
ENCODING= 'UTF8' SKIP_HEADER =1
FIELD_DELIMITER='|'
COMPRESSION= GZIP);
Known Issues¶
1. 명시적 열 목록이 없는 CREATE EXTERNAL TABLE 및 CSV 파일 형식
현재, Snowflake 외부 테이블에서는 CSV 파일의 헤더 구문 분석을 지원하지 않습니다. 명시적 열 목록 및 CSV 파일 형식이 없는 외부 테이블이 발견되는 경우 SnowConvert AI는 런타임 오류를 방지하기 위해 SKIP_HEADER 파일 형식 옵션을 생성합니다. 그러나 이로 인해 테이블 열 이름이 자동 생성된 이름 c1, c2, …, cN이 됩니다.
FDM은 헤더를 구문 분석할 수 없으며 이름을 유지하려면 열 이름을 수동으로 바꿔야 함을 알리기 위해 생성됩니다.
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_csv
OPTIONS(
FORMAT='CSV',
URIS=['gs://sc_external_table_bucket/folder_with_csv/Employees.csv']
);
Snowflake¶
CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_MY_EXTERNAL_TABLE_CSV_FORMAT
TYPE = CSV
SKIP_HEADER = 1;
CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_csv
--** SSC-FDM-BQ0005 - PARSING THE CSV HEADER IS NOT SUPPORTED IN EXTERNAL TABLES, COLUMNS MUST BE RENAMED TO MATCH THE ORIGINAL NAMES **
USING TEMPLATE (
SELECT
ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/folder_with_csv/Employees.csv', FILE_FORMAT => 'SC_TEST_MY_EXTERNAL_TABLE_CSV_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_csv/Employees.csv'
FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1);
2. Google Drive 소스를 참조하는 외부 테이블
Snowflake는 Google Drive에 호스팅된 파일에서 데이터 읽기를 지원하지 않습니다. FDM는 이에 대해 알리고 파일을 버킷에 업로드하고 외부 스테이지를 통해 액세스하도록 요청하기 위해 생성됩니다.
PATTERN 절은 자동 생성된 FILE_PATH0, FILE_PATH1, …, FILE_PATHN 자리 표시자를 보유합니다. 파일을 외부 위치로 이동한 후 파일/폴더 경로로 바꿔야 합니다.
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_drive_test
OPTIONS(
FORMAT='JSON',
URIS=['https://drive.google.com/open?id=someFileId']
);
Snowflake¶
CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_MY_EXTERNAL_TABLE_DRIVE_TEST_FORMAT
TYPE = JSON;
CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_drive_test USING TEMPLATE (
SELECT
ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
--** SSC-FDM-BQ0008 - THE INFER_SCHEMA FUNCTION REQUIRES A FILE PATH WITHOUT WILDCARDS TO GENERATE THE TABLE TEMPLATE, REPLACE THE FILE_PATH PLACEHOLDER WITH IT **
TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/FILE_PATH', FILE_FORMAT => 'SC_TEST_MY_EXTERNAL_TABLE_DRIVE_TEST_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS A EXTERNAL LOCATION, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
--** SSC-FDM-BQ0006 - READING FROM GOOGLE DRIVE IS NOT SUPPORTED IN SNOWFLAKE, UPLOAD THE FILES TO THE EXTERNAL LOCATION AND REPLACE THE FILE_PATH PLACEHOLDERS **
PATTERN = 'FILE_PATH0'
FILE_FORMAT = (TYPE = JSON);
3. GOOGLE_SHEETS 파일 형식이 있는 외부 테이블
Snowflake는 Google Sheets를 파일 형식으로 지원하지 않지만, 해당 구조는 Snowflake에서 지원하는 CSV 파일과 유사합니다.
SnowConvert AI가 GOOGLE_SHEETS 형식을 사용하여 외부 테이블을 감지하는 경우 대신 CSV 파일 형식으로 외부 테이블을 생성합니다.
Google Sheets는 Google Drive에 저장되므로 이전에 언급했듯이 파일을 CSV로 외부 위치에 업로드하고 PATTERN 절에 파일 경로를 지정해야 합니다.
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.spreadsheetTable
(
Name STRING,
Code INTEGER,
Price INTEGER,
Expiration_date DATE
)
OPTIONS(
format="GOOGLE_SHEETS",
skip_leading_rows = 1,
uris=['https://docs.google.com/spreadsheets/d/someFileId/edit?usp=sharing']
);
Snowflake¶
--** SSC-FDM-BQ0007 - READING FROM SPREADSHEETS IS NOT SUPPORTED IN SNOWFLAKE, USE THE CSV FILE TYPE INSTEAD **
CREATE OR REPLACE EXTERNAL TABLE test.spreadsheetTable
(
Name STRING AS CAST(GET_IGNORE_CASE($1, 'c1') AS STRING),
Code INTEGER AS CAST(GET_IGNORE_CASE($1, 'c2') AS INTEGER),
Price INTEGER AS CAST(GET_IGNORE_CASE($1, 'c3') AS INTEGER),
Expiration_date DATE AS CAST(GET_IGNORE_CASE($1, 'c4') AS DATE)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS A EXTERNAL LOCATION, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
--** SSC-FDM-BQ0006 - READING FROM GOOGLE DRIVE IS NOT SUPPORTED IN SNOWFLAKE, UPLOAD THE FILES TO THE EXTERNAL LOCATION AND REPLACE THE FILE_PATH PLACEHOLDERS **
PATTERN = 'FILE_PATH0'
FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1);
4. 지원되지 않는 파일 형식이 있는 외부 테이블
Snowflake는 다음 BigQuery 형식을 지원합니다.
BigQuery |
Snowflake |
|---|---|
AVRO |
AVRO |
CSV |
CSV |
NEWLINE_DELIMITED_JSON |
JSON |
ORC |
ORC |
PARQUET |
PARQUET |
다른 형식은 지원되지 않는 것으로 표시됩니다.
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.backup_restore_table
OPTIONS (
format = 'DATASTORE_BACKUP',
uris = ['gs://backup_bucket/backup_folder/*']
);
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0013 - EXTERNAL TABLE DATA FORMAT NOT SUPPORTED IN SNOWFLAKE ***/!!!
CREATE OR REPLACE EXTERNAL TABLE test.backup_restore_table
OPTIONS (
format = 'DATASTORE_BACKUP',
uris = ['gs://backup_bucket/backup_folder/*']
);
**5. Hive 분할 외부 테이블
Snowflake는 hive 분할 외부 테이블을 지원하지 않으며, WITH PARTITION COLUMNS 절은 지원되지 않는 것으로 표시됩니다.
BigQuery¶
CREATE EXTERNAL TABLE test.CustomHivePartitionedTable
WITH PARTITION COLUMNS (
field_1 STRING,
field_2 INT64)
OPTIONS (
uris = ['gs://sc_external_table_bucket/folder_with_parquet/*'],
format = 'PARQUET',
hive_partition_uri_prefix = 'gs://sc_external_table_bucket/folder_with_parquet',
require_hive_partition_filter = false);
Snowflake¶
CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_CUSTOMHIVEPARTITIONEDTABLE_FORMAT
TYPE = PARQUET;
CREATE EXTERNAL TABLE test.CustomHivePartitionedTable USING TEMPLATE (
SELECT
ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
--** SSC-FDM-BQ0008 - THE INFER_SCHEMA FUNCTION REQUIRES A FILE PATH WITHOUT WILDCARDS TO GENERATE THE TABLE TEMPLATE, REPLACE THE FILE_PATH PLACEHOLDER WITH IT **
TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/FILE_PATH', FILE_FORMAT => 'SC_TEST_CUSTOMHIVEPARTITIONEDTABLE_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0014 - HIVE PARTITIONED EXTERNAL TABLES ARE NOT SUPPORTED IN SNOWFLAKE ***/!!!
WITH PARTITION COLUMNS (
field_1 STRING,
field_2 INT64)
PATTERN = 'folder_with_parquet/.*'
FILE_FORMAT = (TYPE = PARQUET)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0001 - SNOWFLAKE DOES NOT SUPPORT THE OPTIONS: HIVE_PARTITION_URI_PREFIX, REQUIRE_HIVE_PARTITION_FILTER. ***/!!!
OPTIONS(
hive_partition_uri_prefix = 'gs://sc_external_table_bucket/folder_with_parquet',
require_hive_partition_filter = false
);
6. 열 목록이 없고 INFER_SCHEMA 함수에 대한 유효한 파일 URI가 없는 외부 테이블
INFER_SCHEMA 함수에는 테이블 열을 구성하는 데 사용할 파일 또는 폴더의 경로를 지정하는 LOCATION 매개 변수가 필요합니다. 그러나 이 경로는 정규식, 즉 와일드 카드 * 문자를 지원하지 않습니다.
테이블에 열이 없는 경우, SnowConvert AI는 와일드카드를 사용하지 않는 항목을 찾기 위해 모든 URIS를 확인하여 INFER_SCHEMA 함수에 사용합니다. 이러한 기준을 충족하는 URI가 없는 경우 FDM 및 FILE_PATH 자리 표시자가 생성됩니다. 이 자리 표시자는 테이블 열을 생성하기 위해 외부 테이블에서 참조하는 파일 중 하나의 경로로 바꿔야 합니다.
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2
OPTIONS(
FORMAT='JSON',
URIS=['gs://sc_external_table_bucket/folder_with_json/*']
);
Snowflake¶
CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_MY_EXTERNAL_TABLE_JSON2_FORMAT
TYPE = JSON;
CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2 USING TEMPLATE (
SELECT
ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
--** SSC-FDM-BQ0008 - THE INFER_SCHEMA FUNCTION REQUIRES A FILE PATH WITHOUT WILDCARDS TO GENERATE THE TABLE TEMPLATE, REPLACE THE FILE_PATH PLACEHOLDER WITH IT **
TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/FILE_PATH', FILE_FORMAT => 'SC_TEST_MY_EXTERNAL_TABLE_JSON2_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_json/.*'
FILE_FORMAT = (TYPE = JSON);
7. 지원되지 않는 테이블 옵션
지원되는 테이블 옵션 패턴에 언급되지 않은 다른 모든 테이블 옵션은 지원되지 않는 것으로 표시됩니다.
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE dataset.CsvTable
(
x INTEGER,
y STRING
)
OPTIONS (
format = 'CSV',
uris = ['gs://bucket/example.csv'],
field_delimiter = '|',
max_bad_records = 5
);
Snowflake¶
CREATE OR REPLACE EXTERNAL TABLE dataset.CsvTable
(
x INTEGER AS CAST(GET_IGNORE_CASE($1, 'c1') AS INTEGER),
y STRING AS CAST(GET_IGNORE_CASE($1, 'c2') AS STRING)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'example.csv'
FILE_FORMAT = (TYPE = CSV
field_delimiter = '|')
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0001 - SNOWFLAKE DOES NOT SUPPORT THE OPTIONS: MAX_BAD_RECORDS. ***/!!!
OPTIONS(
max_bad_records = 5
);
관련 EWIs¶
SSC-EWI-BQ0013: 외부 테이블 데이터 형식은 Snowflake에서 지원되지 않습니다.
SSC-EWI-BQ0014: Hive 분할 외부 테이블은 Snowflake에서 지원되지 않습니다.
SSC-EWI-BQ0015: 외부 테이블에는 외부 위치에 액세스하고 EXTERNAL_STAGE 자리 표시자를 정의하고 바꾸기 위한 외부 스테이지가 필요합니다.
SSC-FDM-BQ0004: INFER_SCHEMA 함수는 테이블 템플릿을 생성하고 FILE_PATH 자리 표시자로 교체하기 위해 와일드카드가 없는 파일 경로가 필요합니다.
SSC-FDM-BQ0005: CSV 헤더 구문 분석은 외부 테이블에서 지원되지 않습니다. 원래 이름과 일치하도록 열의 이름을 바꿔야 합니다.
SSC-FDM-BQ0006: Google Drive에서 읽기 기능은 Snowflake에서 지원되지 않습니다. 외부 위치에 파일을 업로드하고 FILE_PATH 자리 표시자를 바꿉니다.
SSC-FDM-BQ0007: Snowflake에서는 스프레드시트에서 읽기 기능이 지원되지 않으며, 대신 CSV 파일 형식을 사용합니다.
CREATE TABLE CLONE¶
문법 구문¶
CREATE TABLE [ IF NOT EXISTS ]
destination_table_name
CLONE source_table_name [FOR SYSTEM_TIME AS OF time_expression]
...
[OPTIONS(table_option_list)]
샘플 소스 패턴¶
FOR SYSTEM TIME AS OF¶
BigQuery¶
CREATE TABLE my_clone_table
CLONE some_table_name2
FOR SYSTEM_TIME AS OF TIMESTAMP "2025-01-01 00:00:00 UTC";
Snowflake¶
CREATE TABLE my_clone_table
CLONE some_table_name2 AT (TIMESTAMP => TIMESTAMP "2025-01-01 00:00:00 UTC");
::{참고} CREATE TABLE CLONE 문의 LABELS 옵션은 TAGs로 변환되지 않습니다. 이는 소스 테이블의 TAGs가 복사되지만, 테이블 복사 중에는 변경할 수 없기 때문입니다. 다른 테이블 옵션의 변환은 CREATETABLE 문에 대해 지정된 변환과 동일합니다.
CREATE TABLE COPY
Grammar syntax
CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ] table_name
COPY source_table_name
...
[OPTIONS(table_option_list)]
Sample Source Patterns
일반적인 경우
Snowflake의 CREATE TABLE CLONE은 기능적으로 CREATE TABLE COPY와 동등합니다.
입력 코드
BigQuery
CREATE TABLE newtable
COPY sourceTable;
Snowflake
CREATE TABLE newtable CLONE sourceTable;
참고
CREATE TABLE COPY 문의 LABELS 옵션은 TAGs로 변환되지 않습니다. 이는 소스 테이블의 TAGs가 복사되지만, 테이블 복사 중에는 변경할 수 없기 때문입니다. 다른 테이블 옵션의 변환은 CREATE TABLE 문에 대해 지정된 변환과 동일합니다.
CREATE TABLE LIKE¶
문법 구문¶
CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ]
table_name
LIKE [[project_name.]dataset_name.]source_table_name
...
[OPTIONS(table_option_list)]
성공
CREATE TABLE LIKE는 Snowflake에서 완벽하게 지원됩니다.
참고
CREATE TABLE LIKE 문의 LABELS 옵션은 TAGs로 변환되지 않습니다. 이는 소스 테이블의 TAGs가 복사되지만, 테이블 복사 중에는 변경할 수 없기 때문입니다. 다른 테이블 옵션의 변환은 CREATE TABLE 문에 대해 지정된 변환과 동일합니다.
CREATE TABLE SNAPSHOT¶
문법 구문¶
CREATE SNAPSHOT TABLE [ IF NOT EXISTS ] table_snapshot_name
CLONE source_table_name
[FOR SYSTEM_TIME AS OF time_expression]
[OPTIONS(snapshot_option_list)]
샘플 소스 패턴¶
일반적인 경우¶
Snowflake에서 스냅샷 키워드가 제거되어 테이블이 CREATE TABLE CLONE으로 변환됩니다.
스냅샷과 복제본의 두 가지 차이점은 스냅샷은 편집할 수 없으며 일반적으로 만료 날짜가 있다는 것입니다. 만료 날짜는 지원되지 않으며, CREATETABLE 문의 지원되지 않는 옵션에 지정된 대로 처리됩니다.
BigQuery¶
CREATE SNAPSHOT TABLE mytablesnapshot
CLONE mytable;
Snowflake¶
CREATE TABLE mytablesnapshot CLONE mytable;
FOR SYSTEM TIME AS OF¶
BigQuery¶
CREATE SNAPSHOT TABLE IF NOT EXISTS my_snapshot_table2
CLONE some_table_name2
FOR SYSTEM_TIME AS OF TIMESTAMP "2025-01-01 00:00:00 UTC";
Snowflake¶
CREATE TABLE IF NOT EXISTS my_snapshot_table2
CLONE some_table_name2 AT (TIMESTAMP => TIMESTAMP "2025-01-01 00:00:00 UTC");
참고
CREATE TABLE COPY 문의 LABELS 옵션은 TAGs로 변환되지 않습니다. 이는 소스 테이블의 TAGs가 복사되지만, 테이블 복사 중에는 변경할 수 없기 때문입니다.
다른 테이블 옵션의 변환은 CREATE TABLE 문에 대해 지정된 변환과 동일합니다.