SnowConvert AI - Hive - CREATE EXTERNAL TABLE¶
Applies to
Hive SQL
Spark SQL
Databricks SQL
Descrição¶
As tabelas externas definem uma nova tabela usando uma fonte de dados. (Referência de linguagem SQL do Spark CREATE DATASOURCE TABLE)
CREATE TABLE [ IF NOT EXISTS ] table_identifier
[ ( col_name1 col_type1 [ COMMENT col_comment1 ], ... ) ]
USING data_source
[ OPTIONS ( key1=val1, key2=val2, ... ) ]
[ PARTITIONED BY ( col_name1, col_name2, ... ) ]
[ CLUSTERED BY ( col_name3, col_name4, ... )
[ SORTED BY ( col_name [ ASC | DESC ], ... ) ]
INTO num_buckets BUCKETS ]
[ LOCATION path ]
[ COMMENT table_comment ]
[ TBLPROPERTIES ( key1=val1, key2=val2, ... ) ]
[ AS select_statement ]
A instrução CREATE EXTERNAL TABLE do Spark/Databricks será transformada na instrução CREATE EXTERNAL TABLE Snowflake; no entanto, essa transformação exige intervenção do usuário.
Para completar a transformação realizada pelo SnowConvert AI, é necessário definir uma integração de armazenamento, uma [área de preparação externa](https://docs.snowflake .com/en/sql-reference/sql/create-stage) e (opcionalmente) uma integração de notificação com acesso à origem externa onde os arquivos estão localizados. Consulte os seguintes guias sobre como configurar a conexão para cada provedor:
Para tabelas externas que fazem referência ao Google Cloud Storage
Para tabelas externas que fazem referência ao Armazenamento de blobs Azure
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 as instruções do 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 iguais, e se uma integração de notificação tiver sido criada.
Amostra de padrões da origem¶
Criar tabela externa 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.
Código de entrada:¶
CREATE EXTERNAL TABLE IF NOT EXISTS external_table
(
order_id int,
date string,
client_name string,
total float
)
USING AVRO
LOCATION 'gs://sc_external_table_bucket/folder_with_avro/orders.avro';
Código de saída:¶
CREATE EXTERNAL TABLE IF NOT EXISTS external_table
(
order_id int AS CAST(GET_IGNORE_CASE($1, 'order_id') AS int),
date string AS CAST(GET_IGNORE_CASE($1, 'date') AS string),
client_name string AS CAST(GET_IGNORE_CASE($1, 'client_name') AS string),
total float AS CAST(GET_IGNORE_CASE($1, 'total') AS float)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs:, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
FILE_FORMAT = (TYPE = AVRO)
PATTERN = '/sc_external_table_bucket/folder_with_avro/orders.avro'
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "spark", "convertedOn": "06/18/2025", "domain": "no-domain-provided" }}';
CREATE EXTERNAL TABLE sem uma 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 essa finalidade. Esse formato de arquivo só é necessário ao executar a instrução CREATE EXTERNAL TABLE e será automaticamente descartado quando a sessão terminar.
Código de entrada:¶
CREATE EXTERNAL TABLE IF NOT EXISTS external_table_No_Columns
using AVRO
LOCATION 'gs://sc_external_table_bucket/folder_with_avro/orders.avro';
Código de saída:¶
CREATE OR REPLACE TEMPORARY FILE FORMAT SC_HIVE_FORMAT_ORDERS_NO_COLUMNS_FORMAT
TYPE = AVRO;
CREATE EXTERNAL TABLE IF NOT EXISTS hive_format_orders_No_Columns USING TEMPLATE (
SELECT
ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
--** SSC-FDM-0035 - 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_HIVE_FORMAT_ORDERS_NO_COLUMNS_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs:, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
FILE_FORMAT = (TYPE = AVRO)
PATTERN = '/sc_external_table_bucket/folder_with_avro/orders.avro'
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "spark", "convertedOn": "06/18/2025", "domain": "no-domain-provided" }}';
CREATE EXTERNAL TABLE usando o formato Hive¶
A criação de tabelas externas usando o formato Hive também é compatível. Será adicionado um FDM informando ao usuário que a inserção não é suportada nessas tabelas.
Código de entrada:¶
CREATE EXTERNAL TABLE IF NOT EXISTS External_table_hive_format
(
order_id int,
date string,
client_name string,
total float
)
stored as AVRO
LOCATION 'gs://sc_external_table_bucket/folder_with_avro/orders.avro';
Código de saída:¶
--** SSC-FDM-HV0001 - INSERTING VALUES INTO AN EXTERNAL TABLE IS NOT SUPPORTED IN SNOWFLAKE **
CREATE EXTERNAL TABLE IF NOT EXISTS hive_format_orders_Andres
(
order_id int AS CAST(GET_IGNORE_CASE($1, 'order_id') AS int),
date string AS CAST(GET_IGNORE_CASE($1, 'date') AS string),
client_name string AS CAST(GET_IGNORE_CASE($1, 'client_name') AS string),
total float AS CAST(GET_IGNORE_CASE($1, 'total') AS float)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs:, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
FILE_FORMAT = (TYPE = AVRO)
PATTERN = '/sc_external_table_bucket/folder_with_avro/orders.avro'
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "spark", "convertedOn": "06/18/2025", "domain": "no-domain-provided" }}';
Problemas conhecidos¶
1. Tabelas externas com formatos de arquivo não suportados
O Snowflake oferece suporte aos seguintes formatos Spark:
CSV
PARQUET
ORC
XML
JSON
AVRO
Outros formatos serão marcados como não suportados.
2. Opções de tabela não suportadas
Algumas opções de tabela não são suportadas no SnowConvert AI e são marcados com um EWI.
Código de entrada:¶
CREATE EXTERNAL TABLE IF NOT EXISTS hive_format_orders_Andres
(
order_id int,
date string,
client_name string,
total float
)
using AVRO
LOCATION 'gs://sc_external_table_bucket/folder_with_avro/orders.avro'
Tblproperties (
'unsupported_table_option' = 'value'
);
Código de saída:¶
CREATE EXTERNAL TABLE IF NOT EXISTS hive_format_orders_Andres
(
order_id int AS CAST(GET_IGNORE_CASE($1, 'order_id') AS int),
date string AS CAST(GET_IGNORE_CASE($1, 'date') AS string),
client_name string AS CAST(GET_IGNORE_CASE($1, 'client_name') AS string),
total float AS CAST(GET_IGNORE_CASE($1, 'total') AS float)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs:, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = '/sc_external_table_bucket/folder_with_avro/orders.avro'
FILE_FORMAT = (TYPE = AVRO)
!!!RESOLVE EWI!!! /*** SSC-EWI-0016 - SNOWFLAKE DOES NOT SUPPORT THE OPTIONS: 'UNSUPPORTED_TABLE_OPTION'. ***/!!!
TBLPROPERTIES (
'unsupported_table_option' = 'value'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "spark", "convertedOn": "06/19/2025", "domain": "no-domain-provided" }}';