SnowConvert AI - BigQuery - CREATE TABLE

Sintaxe gramatical

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

Amostra de padrões da origem


DEFAULT COLLATE

BigQuery
CREATE TABLE table1 (
    col1 STRING 
) 
DEFAULT COLLATE 'und:ci';
Copy
Snowflake
CREATE TABLE table1 (
    col1 STRING
)
DEFAULT_DDL_COLLATION='und-ci';
Copy

Opção de tabela de rótulos

BigQuery
CREATE TABLE table1
(
  col1 INT,
  col2 DATE
)
OPTIONS(
  labels=[("org_unit", "development")]
);
Copy
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" }}'
;
Copy

Opção de tabela de descrição

BigQuery
CREATE TABLE table1
(
  col1 INT,
  col2 DATE
)
OPTIONS(
  description = 'My table comment'
);
Copy
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" }}'
;
Copy

Opção de tabela de descrição

BigQuery
CREATE TABLE table1
(
  col1 INT,
  col2 DATE
)
OPTIONS(
  friendly_name = 'Some_table'
);
Copy
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" }}'
;
Copy

Problemas conhecidos

1. Opções de tabela não suportadas

Nem todas as opções de tabela são suportadas no Snowflake, quando uma opção de tabela sem suporte é encontrada na cláusula OPTIONS, um EWI é gerado para alertar sobre isso.

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

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" }}'
;
Copy

2. O microparticionamento é gerenciado automaticamente pelo Snowflake

O Snowflake realiza o particionamento automático dos dados. O particionamento definido pelo usuário não é suportado.

BigQuery
 CREATE TABLE table1(
    transaction_id INT, 
    transaction_date DATE
)
PARTITION BY transaction_date;
Copy
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;
Copy

COLUMN DEFINITION

Sintaxe gramatical

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

Amostra de padrões da origem

Opção de descrição

BigQuery
CREATE TABLE table1 (
  col1 VARCHAR(20) OPTIONS(description="A repeated STRING field")
);
Copy
Snowflake
CREATE TABLE table1 (
  col1 VARCHAR(20) COMMENT = 'A repeated STRING field'
);
Copy

COLLATE

BigQuery
CREATE TABLE table1 (
  col1 STRING COLLATE 'und:ci'
);
Copy
Snowflake
CREATE TABLE table1 (
  col1 STRING COLLATE 'und-ci'
);
Copy

Problemas conhecidos

1. Modo de arredondamento incompatível

O Snowflake não oferece suporte à especificação de um modo de arredondamento padrão nas colunas.

BigQuery

CREATE TABLE table1 (
  col1 STRING OPTIONS(rounding_mode = "ROUND_HALF_EVEN")
);
Copy

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

EWIs relacionados

  1. SSC-EWI-BQ0001: O Snowflake não oferece suporte à cláusula de opções.

CREATE EXTERNAL TABLE

Descrição

Tabelas externas permitem dados de consulta BigQuery que estão armazenados fora do armazenamento BigQuery. ([Referência de linguagem BigQuery SQL CREATE EXTERNAL TABLE](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition- language#create_external_table_Statement))

Sintaxe

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

A instrução CREATE EXTERNAL TABLE de BigQuery será transformada em uma instrução CREATE EXTERNAL TABLE do Snowflake, no entanto, essa transformação requer a intervenção do usuário.

Para completar a transformação realizada pelo SnowConvert AI, É necessário definir uma Integração de Armazenamento, um Estágio Externo e (opcionalmente) uma Integração de Notificação que tenham acesso à fonte externa onde os arquivos estão localizados. Consulte os seguintes guias sobre como configurar a conexão para cada provedor:

Considerações importantes para as transformações mostradas nesta página:

  • O espaço reservado @EXTERNAL_STAGE deve ser substituído pelo estágio externo criado após seguir o guia anterior.

  • Supõe-se que o estágio externo apontará para a raiz do bucket. Isso é importante, porque a cláusula PATTERN gerada para cada tabela especifica os caminhos do arquivo/pasta começando pela base do bucket. Definir um estágio externo que aponta para um local diferente no bucket pode causar um comportamento indesejado.

  • A cláusula AUTO_REFRESH = FALSE é gerada para evitar erros; observe que a atualização automática de metadados de tabela externa só é válida se o provedor de nuvem de sua conta Snowflake e o provedor de bucket forem o mesmo e uma integração de notificação tiver sido criada.

Amostra de padrões da origem

CREATE EXTERNAL TABLE com lista de colunas explícita

Quando a lista de colunas é fornecida, o SnowConvert AI automaticamente gera as opções da coluna de expressão AS para cada coluna para extrair os valores do arquivo.

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

CREATE EXTERNAL TABLE sem lista de colunas explícita

Quando a lista de colunas não é fornecida, o BigQuery detecta automaticamente o esquema de colunas da estrutura do arquivo. Para replicar esse comportamento, o SnowConvert AI vai gerar uma cláusula USING TEMPLATE que usa INFER_SCHEMA para gerar as definições das colunas.

Como a função INFER_SCHEMA requer um formato de arquivo para funcionar, o SnowConvert AI vai gerar um formato de arquivo temporário para este fim; este formato de arquivo só é necessário ao executar a instrução CREATE EXTERNAL TABLE e ela será automaticamente descartada quando a sessão terminar.

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

CREATE EXTERNAL TABLE com vários URIs

Quando URIs de origem múltipla são especificados, eles são unidos na regex da cláusula PATTERN no Snowflake; os caracteres curinga * usados serão transformados em seu .* equivalentes no 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/*']
);
Copy
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);
Copy

Cláusula WITH CONNECTION

A cláusula WITH CONNECTION é removida porque as informações de conexão já foram fornecidas ao Snowflake usando a integração de armazenamento.

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

Opções de tabela compatíveis

As seguintes opções de tabela externa são suportadas no Snowflake e transformadas por 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']
);
Copy
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);
Copy

Problemas conhecidos

1. CREATE EXTERNAL TABLE sem lista de colunas explícita e formato de arquivo CSV

Atualmente, as tabelas externas do Snowflake não são compatíveis com a análise do cabeçalho de arquivos CSV. Quando uma tabela externa sem uma lista de colunas explícita e com formato de arquivo CSV é encontrada, o SnowConvert AI produz a opção de formato de arquivo SKIP_HEADER para evitar erros de tempo de execução; no entanto, isso faz com que os nomes das colunas da tabela tenham os nomes c1, c2, …, cN gerados automaticamente.

Um FDM é gerado para notificar que o cabeçalho não pode ser analisado e que é necessário renomear manualmente as colunas para preservar os nomes.

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

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

2. Tabelas externas que fazem referência a fontes do Google Drive

O Snowflake não oferece suporte à leitura de dados de arquivos hospedados no Google Drive. Um FDM será gerado para notificar sobre isso e solicitar que os arquivos sejam carregados no bucket e acessados por meio do estágio externo.

A cláusula PATTERN conterá espaços reservados FILE_PATH0, FILE_PATH1, …, FILE_PATHN gerados automaticamente que devem ser substituídos pelo caminho do arquivo/pasta após os arquivos serem movidos para a localização externa.

BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_drive_test
OPTIONS(
  FORMAT='JSON',
  URIS=['https://drive.google.com/open?id=someFileId']
);
Copy
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);
Copy

3. Tabelas externas com o formato do arquivo GOOGLE_SHEETS

O Snowflake não é compatível com o Planilhas Google como formato de arquivo; no entanto, a estrutura dele é semelhante aos arquivos CSV, que são compatíveis com o Snowflake.

Quando o SnowConvert AI detecta uma tabela externa que usa o formato GOOGLE_SHEETS, ele produz uma tabela externa com o formato de arquivo CSV.

Como o Google Sheets é armazenado no Google Drive, seria necessário carregar os arquivos como CSV para o local externo e especificar os caminhos do arquivo na cláusula PATTERN, conforme mencionado na questão anterior.

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

4. Tabelas externas com formatos de arquivo não suportados

O Snowflake é compatível com os seguintes formatos do BigQuery:

BigQuery

Snowflake

AVRO

AVRO

CSV
GOOGLE_SHEETS

CSV

NEWLINE_DELIMITED_JSON
JSON

JSON

ORC

ORC

PARQUET

PARQUET

Outros formatos serão marcados como não suportados.

BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.backup_restore_table
OPTIONS (
  format = 'DATASTORE_BACKUP',
  uris = ['gs://backup_bucket/backup_folder/*']
);
Copy
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/*']
);
Copy

5. Tabelas externas particionadas do Hive

O Snowflake não oferece suporte a tabelas externas particionadas do Hive. A cláusula WITH PARTITION COLUMNS será marcada como não suportada.

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

6. Tabela externa sem lista de colunas e nenhum URI de arquivo válido para a função INFER_SCHEMA

A função INFER_SCHEMA requer um LOCATION que especifica o caminho para um arquivo ou pasta que será usado para construir as colunas da tabela; no entanto, esse caminho não oferece suporte a regex, o que significa que o caractere curinga * não é suportado.

Quando a tabela não tem colunas, o SnowConvert AI verifica todos os URIS a fim de encontrar um que não use curingas e o utiliza na função INFER_SCHEMA. Quando nenhum URI atende a esses critérios, um espaço reservado FDM e FILE_PATH é gerado. O espaço reservado precisa ser substituído pelo caminho de um dos arquivos referenciados pela tabela externa para gerar as colunas da tabela.

BigQuery
CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2
OPTIONS(
  FORMAT='JSON',
  URIS=['gs://sc_external_table_bucket/folder_with_json/*']
);
Copy
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);
Copy

7. Opções de tabela não suportadas

Qualquer outra opção de tabela não mencionada no padrão Opções de tabela compatíveis será marcada como não compatível.

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

EWIs relacionados

  1. SSC-EWI-BQ0013: Formato de dados da tabela externa não suportado no Snowflake

  2. SSC-EWI-BQ0014: As tabelas externas particionadas do Hive não são suportadas no Snowflake

  3. SSC-EWI-BQ0015: A tabela externa requer um estágio externo para acessar um local externo, definir e substituir o espaço reservado EXTERNAL_STAGE

  4. SSC-FDM-BQ0004: A função INFER_SCHEMA requer um caminho de arquivo sem curingas para gerar o modelo de tabela; substitua o espaço reservado FILE_PATH por ele

  5. SSC-FDM-BQ0005: A análise do cabeçalho CSV não é compatível em tabelas externas; as colunas devem ser renomeadas para corresponder aos nomes originais.

  6. SSC-FDM-BQ0006: A leitura do Google Drive não é compatível com o Snowflake; carregue os arquivos para o local externo e substitua os espaços reservados FILE_PATH

  7. SSC-FDM-BQ0007: A leitura de planilhas não é compatível com o Snowflake; use o tipo de arquivo CSV em vez disso

CREATE TABLE CLONE

Sintaxe gramatical

CREATE TABLE [ IF NOT EXISTS ]
destination_table_name
CLONE source_table_name [FOR SYSTEM_TIME AS OF time_expression]
...
[OPTIONS(table_option_list)]
Copy

Amostra de padrões da origem

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";
Copy
Snowflake
CREATE TABLE my_clone_table
CLONE some_table_name2 AT (TIMESTAMP => TIMESTAMP "2025-01-01 00:00:00 UTC");
Copy

::{note} A opção LABELS em instruções CREATE TABLE CLONE não é transformada em TAGs porque so TAGs da tabela de origem são copiados; eles não podem ser alterados durante a cópia da tabela. A transformação de outras opções de tabela é a mesma especificada para a instruçãoCREATE TABLE.

CREATE TABLE COPY

Grammar syntax

CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ] table_name
COPY source_table_name
...
[OPTIONS(table_option_list)]
Copy

Sample Source Patterns

Caso geral

CREATE TABLE CLONE em Snowflake é funcionalmente equivalente a CREATE TABLE COPY.

Código de entrada
BigQuery
CREATE TABLE newtable
COPY sourceTable;
Copy
Snowflake
CREATE TABLE newtable CLONE sourceTable;
Copy

Nota

A opção LABELS em instruções CREATE TABLE COPY não é transformada em TAGs porque as TAGs da tabela de origem são copiadas. Elas não podem ser alteradas durante a cópia da tabela. A transformação de outras opções de tabela é a mesma especificada para a instrução CREATE TABLE statement.

CREATE TABLE LIKE

Sintaxe gramatical

CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ]
table_name
LIKE [[project_name.]dataset_name.]source_table_name
...
[OPTIONS(table_option_list)]
Copy

Sucesso

CREATE TABLE LIKE é totalmente compatível com o Snowflake.

Nota

A opção LABELS em instruções CREATE TABLE LIKE não é transformada em TAGs porque as TAGs da tabela de origem são copiadas. Elas não podem ser alteradas durante a cópia da tabela. A transformação de outras opções de tabela é a mesma especificada para a instrução CREATE TABLE statement.

CREATE TABLE SNAPSHOT

Sintaxe gramatical

CREATE SNAPSHOT TABLE [ IF NOT EXISTS ] table_snapshot_name
CLONE source_table_name
[FOR SYSTEM_TIME AS OF time_expression]
[OPTIONS(snapshot_option_list)]
Copy

Amostra de padrões da origem

Caso geral

A palavra-chave Snapshot é removida no Snowflake, transformando a tabela em um CREATE TABLE CLONE.

As duas diferenças entre instantâneos e clones são que os instantâneos não são editáveis e geralmente têm uma data de expiração. Datas de expiração não são suportadas; isso é tratado conforme especificado para Opções de instrução CREATE TABLE não são suportadas.

BigQuery
CREATE SNAPSHOT TABLE mytablesnapshot
CLONE mytable;
Copy
Snowflake
CREATE TABLE mytablesnapshot CLONE mytable;
Copy

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";
Copy
Snowflake
CREATE TABLE IF NOT EXISTS my_snapshot_table2
CLONE some_table_name2 AT (TIMESTAMP => TIMESTAMP "2025-01-01 00:00:00 UTC");
Copy

Nota

A opção LABELS em instruções CREATE TABLE COPY não é transformada em TAGs porque as TAGs da tabela de origem são copiadas. Elas não podem ser alteradas durante a cópia da tabela.

A transformação de outras opções de tabela é a mesma especificada para a instrução CREATE TABLE statement.