Introdução às tabelas externas¶
Uma tabela externa é um recurso do Snowflake que você pode usar para consultar dados armazenados em uma área de preparação externa como se os dados estivessem dentro de uma tabela no Snowflake. A área de preparação externa não faz parte do Snowflake; portanto, o Snowflake não armazena nem gerencia a área de preparação. Para reforçar sua postura de segurança, você pode configurar a área de preparação externa para conectividade privada de saída para acessar a tabela externa usando conectividade privada.
As tabelas externas permitem armazenar (no Snowflake) determinados metadados em nível de arquivo, incluindo nomes de arquivos, identificadores de versão e propriedades relacionadas. As tabelas externas podem acessar dados armazenados em qualquer formato aceito pelo comando COPY INTO <tabela>, exceto XML.
As tabelas externas são somente leitura. Não é possível executar operações de linguagem de manipulação de dados (DML) em tabelas externas. No entanto, você pode usar tabelas externas para operações de consulta e junção. Você também pode criar exibições em tabelas externas.
Consultar dados em uma tabela externa pode ser mais lento do que consultar dados armazenados nativamente em uma tabela no Snowflake. Para melhorar o desempenho da consulta, você pode usar uma exibição materializada com base em uma tabela externa. Para otimizar o desempenho da consulta ao trabalhar com arquivos Parquet, considere usar Tabelas Apache Iceberg™.
Nota
Se o Snowflake encontrar um erro durante a verificação de um arquivo no armazenamento em nuvem durante uma operação de consulta, o arquivo é ignorado e a verificação continua no arquivo seguinte. Uma consulta pode verificar parcialmente um arquivo e retornar as linhas verificadas antes de o erro ter sido encontrado.
Neste tópico:
Planejamento do esquema de uma tabela externa¶
As seções a seguir descrevem as opções disponíveis para você planejar suas tabelas externas.
Esquema em leitura¶
Todas as tabelas externas incluem as seguintes colunas:
- VALUE:
Uma coluna do tipo VARIANT que representa uma única linha no arquivo externo.
- METADATA$FILENAME:
Uma pseudocoluna que identifica o nome de cada arquivo de dados preparado incluído na tabela externa, incluindo o caminho no preparo.
- METADATA$FILE_ROW_NUMBER:
Uma pseudocoluna que mostra o número da linha para cada registro em um arquivo de dados preparado.
Para criar tabelas externas, você só precisa ter algum conhecimento do formato do arquivo e do formato de registro dos arquivos de dados de origem. Não é necessário conhecer o esquema dos arquivos de dados.
Nota
SELECT *
sempre retorna a coluna VALUE, na qual todos os dados regulares ou semiestruturados são convertidos nas linhas de variante.
Colunas virtuais¶
Se você tiver familiaridade com o esquema dos arquivos de dados de origem, poderá criar colunas virtuais adicionais como expressões usando a coluna VALUE e as pseudocolunas METADATA$FILENAME ou METADATA$FILE_ROW_NUMBER. Quando os dados externos são verificados, os tipos de dados de quaisquer campos especificados ou elementos de dados semiestruturados no arquivo de dados devem corresponder aos tipos de dados dessas colunas adicionais na tabela externa. Esse requisito permite uma verificação de tipo robusta e a validação do esquema nos dados externos.
Recomendações gerais de dimensionamento de arquivos¶
Para otimizar o número de operações de verificação paralela ao consultar tabelas externas, recomendamos os seguintes tamanhos de arquivo ou grupo de linhas por formato:
Formato |
Intervalo de tamanho recomendado |
Notas |
---|---|---|
Arquivos de parquet |
256 - 512 MB |
|
Grupos de linhas de parquet |
16 - 256 MB |
Quando os arquivos Parquet incluem vários grupos de linhas, o Snowflake pode operar em cada grupo de linhas em um servidor diferente. Para melhorar o desempenho da consulta, recomendamos dimensionar os arquivos Parquet no intervalo recomendado; ou, se forem necessários arquivos de grandes dimensões, incluir vários grupos de linhas em cada arquivo. |
Todos os outros formatos de arquivo com suporte |
16 - 256 MB |
Para um desempenho ideal ao consultar grandes arquivos de dados, crie e consulte exibições materializadas em tabelas externas.
Tabelas externas particionadas¶
Recomendamos enfaticamente particionar suas tabelas externas, o que requer que seus dados subjacentes sejam organizados usando caminhos lógicos que incluam data, hora, país ou dimensões similares no caminho. A partição divide seus dados da tabela externa em várias partes usando colunas de partição.
Uma definição de tabela externa pode incluir várias colunas de partição, que impõem uma estrutura multidimensional sobre os dados externos. As partições são armazenadas nos metadados da tabela externa.
O particionamento melhora o desempenho da consulta. Como os dados externos são particionados em fatias ou partes separadas, o tempo de resposta da consulta é mais rápido ao processar uma pequena parte dos dados em vez de analisar todo o conjunto de dados.
Com base em seus casos de uso individuais, você pode escolher uma das seguintes opções:
Adicionar novas partições automaticamente atualizando uma tabela externa que define uma expressão para cada coluna de partição.
Adicionar novas partições manualmente.
As colunas de partição são definidas quando uma tabela externa é criada, usando a sintaxe CREATE EXTERNAL TABLE … PARTITION BY. Após a criação de uma tabela externa, o método pelo qual as partições são adicionadas não pode ser alterado.
As seções seguintes explicam as diferentes opções para adicionar partições com mais detalhes. Para exemplos, consulte CREATE EXTERNAL TABLE.
Partições adicionadas automaticamente¶
Um criador de tabela externa define colunas de partição em uma tabela nova externa como expressões que analisam as informações de caminho ou nome de arquivo armazenadas na pseudocoluna METADATA$FILENAME. Uma partição consiste em todos os arquivos de dados que correspondem ao caminho ou nome de arquivo na expressão para a coluna de partição.
A seguinte sintaxe CREATE EXTERNAL TABLE adiciona partições automaticamente com base em expressões:
CREATE EXTERNAL TABLE
<table_name>
( <part_col_name> <col_type> AS <part_expr> )
[ , ... ]
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
..
O Snowflake calcula e adiciona partições com base nas expressões de coluna de partição definidas quando os metadados da tabela externa são atualizados. Por padrão, os metadados são atualizados automaticamente quando o objeto é criado. Além disso, o proprietário do objeto pode configurar os metadados para serem atualizados automaticamente quando arquivos de dados novos ou atualizados estiverem disponíveis no estágio externo. O proprietário pode, alternativamente, atualizar os metadados manualmente executando o comando ALTER EXTERNAL TABLE … REFRESH.
Partições adicionadas manualmente¶
Um criador de tabela externa determina o tipo de partição de uma nova tabela externa como definida pelo usuário e especifica apenas os tipos de dados das colunas de partição. Use esta opção quando preferir adicionar e remover partições seletivamente, em vez de adicionar partições automaticamente para todos os novos arquivos em um local de armazenamento externo que correspondam a uma expressão.
Geralmente, você escolhe essa opção para sincronizar tabelas externas com outros metastores (por exemplo, AWS Glue ou Apache Hive).
A seguinte sintaxe CREATE EXTERNAL TABLE adiciona partições manualmente:
CREATE EXTERNAL TABLE
<table_name>
( <part_col_name> <col_type> AS <part_expr> )
[ , ... ]
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
PARTITION_TYPE = USER_SPECIFIED
..
Inclua o parâmetro PARTITION_TYPE = USER_SPECIFIED
obrigatório.
As definições da coluna de partição são expressões que analisam os metadados de coluna na coluna interna (oculta) METADATA$EXTERNAL_TABLE_PARTITION.
O proprietário do objeto adiciona partições aos metadados da tabela externa manualmente executando o comando ALTER EXTERNAL TABLE … ADD PARTITION:
ALTER EXTERNAL TABLE <name> ADD PARTITION ( <part_col_name> = '<string>' [ , <part_col_name> = '<string>' ] ) LOCATION '<path>'
A atualização automática de uma tabela externa com partições definidas pelo usuário não é aceita. A tentativa de atualizar manualmente este tipo de tabela externa produz um erro do usuário.
Suporte para Delta Lake¶
Nota
Esse recurso ainda é suportado, mas será descontinuado em uma versão futura.
Em vez disso, considere usar uma tabela Apache Iceberg™. As tabelas Iceberg usam um volume externo para se conectar aos arquivos de tabela Delta no seu armazenamento em nuvem.
Para mais informações, consulte as tabelas Iceberg e CREATE ICEBERG TABLE (Arquivos Delta no armazenamento de objeto). Você também pode usar Migrar uma tabela externa Delta para o Apache Iceberg™.
Delta Lake é um formato de tabela em seu data lake que suporta transações ACID (atomicidade, consistência, isolamento, durabilidade), entre outros recursos. Todos os dados em Delta Lake são armazenados no formato Apache Parquet. Você pode criar tabelas externas que façam referência aos seus locais de armazenamento em nuvem aprimorados com Delta Lake.
Para criar uma tabela externa que faça referência a um Data Lake, defina o parâmetro TABLE_FORMAT = DELTA
na instrução CREATE EXTERNAL TABLE.
Quando você define esse parâmetro, a tabela externa procura arquivos de log de transações do Delta Lake no local [ WITH ] LOCATION
. Os arquivos de log do Delta têm nomes como _delta_log/00000000000000000000.json
ou _delta_log/00000000000000000010.checkpoint.parquet
. Quando os metadados de uma tabela externa são atualizados, o Snowflake analisa os logs de transações do Delta Lake e determina quais arquivos Parquet são atuais. Em segundo plano, a atualização realiza operações de adição e remoção de arquivos para manter os metadados de tabela externa em sincronia.
Para obter mais informações, incluindo exemplos, consulte CREATE EXTERNAL TABLE.
Nota
Tabelas externas que fazem referência a arquivos Delta Lake não aceitam vetores de exclusão.
Atualizações automatizadas não são aceitas por esse recurso porque a ordem das notificações de eventos acionadas por operações da linguagem de definição de dados (DDL) no armazenamento em nuvem não é garantida. Para registrar arquivos adicionados ou removidos, execute periodicamente uma instrução ALTER EXTERNAL TABLE … REFRESH.
Migrar uma tabela externa Delta para o Apache Iceberg™¶
Para migrar uma ou mais tabelas externas que fazem referência a um Delta Lake para Tabelas Apache Iceberg™, conclua as seguintes etapas:
Use o comando SHOW EXTERNAL TABLES para recuperar o
location
(estágio externo e caminho da pasta) para a(s) tabela(s) externa(s).Por exemplo, o comando a seguir retorna informações para tabelas externas e filtra nomes como
my_delta_ext_table
:SHOW EXTERNAL TABLES LIKE 'my_delta_ext_table';
Criar um volume externo; especifique o local que você recuperou na etapa anterior como
STORAGE_BASE_URL
.Para criar um único volume externo para várias tabelas Delta no mesmo local de armazenamento, defina o local ativo do volume externo (
STORAGE_BASE_URL
) como o diretório raiz comum.Por exemplo, considere os seguintes locais para três tabelas Delta que se ramificam a partir do mesmo local de armazenamento:
s3://my-bucket/delta-ext-table-1/
s3://my-bucket/delta-ext-table-2/
s3://my-bucket/delta-ext-table-3/
Conforme mostrado no exemplo a seguir, especifique o bucket como
STORAGE_BASE_URL
ao criar o volume externo. Mais tarde, você pode especificar o caminho relativo para os arquivos de tabela (por exemplo,delta-ext-table-1/
) comoBASE_LOCATION
ao criar uma tabela Iceberg:CREATE OR REPLACE EXTERNAL VOLUME delta_migration_ext_vol STORAGE_LOCATIONS = ( ( NAME = storage_location_1 STORAGE_PROVIDER = 'S3' STORAGE_BASE_URL = 's3://my-bucket/' STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789123:role/my-storage-role' ) );
Crie uma tabela Iceberg usando o comando CREATE ICEBERG TABLE (Arquivos Delta no armazenamento de objeto). O
BASE_LOCATION
do volume externo deve apontar para o local da tabela externa existente.O exemplo a seguir cria uma tabela Iceberg com base nos arquivos de tabela externa localizados em
s3://my-bucket/delta-ext-table-1/
e faz referência ao volume externo criado anteriormente. Para determinar o local de armazenamento completo da tabela, o Snowflake anexa oBASE_LOCATION
aoSTORAGE_BASE_URL
do volume externo:CREATE ICEBERG TABLE my_delta_table_1 BASE_LOCATION = 'delta-ext-table-1' EXTERNAL_VOLUME = 'delta_migration_ext_vol' CATALOG = 'delta_catalog_integration';
Descarte a tabela externa:
DROP EXTERNAL TABLE my_delta_ext_table_1;
Adicionar ou remover colunas¶
Para alterar uma tabela externa existente para adicionar ou remover colunas, use a seguinte sintaxe ALTER TABLE:
Adicionar colunas: ALTER TABLE … ADD COLUMN.
Remover colunas: ALTER TABLE … DROP COLUMN.
Nota
A coluna padrão VALUE e as pseudocolunas METADATA$FILENAME e METADATA$FILE_ROW_NUMBER não podem ser removidas.
Para obter mais informações, consulte o exemplo em ALTER TABLE.
Proteção de tabelas externas¶
Você pode proteger uma tabela externa usando uma política de mascaramento e uma política de acesso a linhas. Para obter mais informações, consulte os seguintes tópicos:
Exibições materializadas para tabelas externas¶
Em muitos casos, exibições materializadas em tabelas externas podem fornecer um desempenho mais rápido do que consultas equivalentes na tabela externa subjacente. Quando você executa uma consulta com frequência ou sua consulta é complexa o bastante, as exibições materializadas podem ser significativamente mais rápidas.
Atualize os metadados em nível de arquivo em qualquer tabela externa consultada para que suas exibições materializadas reflitam o conjunto atual de arquivos no local de armazenamento em nuvem referenciado.
Você pode atualizar os metadados de uma tabela externa automaticamente usando o serviço de notificação de eventos do seu serviço de armazenamento em nuvem ou manualmente usando as instruções ALTER EXTERNAL TABLE … REFRESH.
Atualização automática dos metadados de tabela externa¶
Você pode atualizar automaticamente os metadados de uma tabela externa usando o serviço de notificação de eventos do seu serviço de armazenamento em nuvem.
A operação de atualização sincroniza os metadados com o conjunto mais recente de arquivos associados no estágio e no caminho externos, ou seja, você pode ver os metadados de um arquivo associado:
Novos arquivos no caminho são adicionados aos metadados da tabela.
As mudanças nos arquivos do caminho são atualizadas nos metadados da tabela.
Os arquivos que não estão mais no caminho são removidos dos metadados da tabela.
Para obter mais informações, consulte Atualizar tabelas externas automaticamente.
Faturamento para tabelas externas¶
O Snowflake inclui uma sobretaxa em suas cobranças para gerenciar notificações de eventos para a atualização automática de metadados de tabela externa. Esta sobretaxa aumenta em relação ao número de arquivos adicionados no armazenamento em nuvem para os estágios externos e caminhos especificados para suas tabelas externas. Esta cobrança de sobretaxa aparece como cobranças do Snowpipe em sua fatura porque o Snowpipe é usado para notificações de eventos para a atualização automática da tabela externa. Você pode estimar essa cobrança consultando a função PIPE_USAGE_HISTORY ou examinando o Account Usage Exibição PIPE_USAGE_HISTORY.
Além disso, o Snowflake inclui uma pequena sobretaxa de manutenção para atualizar manualmente os metadados da tabela externa (usando ALTER EXTERNAL TABLE … REFRESH). Essa sobretaxa é cobrada de acordo com o modelo de faturamento de serviços de nuvem padrão, como todas as atividades similares no Snowflake. Atualizações manuais de tabelas externas padrão são operações exclusivas de serviços em nuvem; no entanto, atualizações manuais de tabelas externas aprimoradas com o Delta Lake dependem de recursos de computação gerenciados pelo usuário (ou seja, um warehouse virtual).
Os usuários com a função ACCOUNTADMIN ou uma função com o privilégio global MONITOR USAGE podem consultar a função de tabela AUTO_REFRESH_REGISTRATION_HISTORY para recuperar o histórico de arquivos de dados registrados nos metadados de objetos especificados e os créditos cobrados por essas operações.
Visão geral dos fluxos de trabalho de configuração e carregamento¶
Nota
As tabelas externas não são compatíveis com o controle de versão de armazenamento (controle de versão do S3, controle de versão de objeto no Google Cloud Storage ou controle de versão do Azure Storage).
Fluxo de trabalho do Amazon S3¶
As etapas a seguir fornecem uma visão geral de alto nível do fluxo de trabalho de configuração e carregamento para tabelas externas que fazem referência aos estágios do Amazon S3. Para obter instruções completas, consulte Atualizar tabelas externas automaticamente para o Amazon S3:
Crie um objeto de preparação nomeado (usando CREATE STAGE) que faça referência ao local externo (ou seja, o bucket S3) em que seus arquivos de dados estão armazenados.
Crie uma tabela externa (usando CREATE EXTERNAL TABLE) que faça referência ao estágio nomeado.
Atualize manualmente os metadados da tabela externa usando ALTER EXTERNAL TABLE … REFRESH para sincronizar os metadados com a lista atual de arquivos no caminho do estágio. Esta etapa também verifica as configurações em sua definição da tabela externa.
Configure uma notificação de evento para o bucket S3. O Snowflake depende de notificações de eventos para atualizar continuamente os metadados de tabela externa para manter a consistência com os arquivos preparados.
Atualize manualmente os metadados da tabela externa mais uma vez usando ALTER EXTERNAL TABLE … REFRESH para sincronizar os metadados com todas as alterações ocorridas após a Etapa 3. Depois disso, as notificações de eventos S3 acionam automaticamente a atualização dos metadados.
Configure privilégios de controle de acesso ao Snowflake para quaisquer funções adicionais a fim de conceder-lhes acesso à tabela externa.
Fluxo de trabalho do Google Cloud Storage¶
As etapas a seguir fornecem uma visão geral de alto nível do fluxo de trabalho de configuração e carregamento para tabelas externas que fazem referência aos estágios do Google Cloud Storage (GCS):
Configure uma assinatura do Google Pub/Sub para eventos GCS.
Crie uma integração de notificação no Snowflake. Uma integração de notificação é um objeto Snowflake que fornece uma interface entre o Snowflake e serviços de enfileiramento de mensagens de terceiros, como Pub/Sub.
Crie um objeto de preparação nomeado (usando CREATE STAGE) que faça referência ao local externo (ou seja, o bucket do GCS) em que seus arquivos de dados estão armazenados.
Crie uma tabela externa (usando CREATE EXTERNAL TABLE) que faça referência ao estágio nomeado e à integração.
Atualize manualmente os metadados da tabela externa uma vez usando ALTER EXTERNAL TABLE … REFRESH para sincronizar os metadados com todas as alterações ocorridas após a Etapa 4. Depois disso, as notificações de eventos Pub/Sub acionam automaticamente a atualização dos metadados.
Configure privilégios de controle de acesso ao Snowflake para quaisquer funções adicionais a fim de conceder-lhes acesso à tabela externa.
Fluxo de trabalho do Microsoft Azure¶
As etapas a seguir fornecem uma visão geral de alto nível do fluxo de trabalho de configuração e carregamento para tabelas externas que fazem referência aos estágios do Azure. Para obter instruções completas, consulte Atualizar tabelas externas automaticamente para o armazenamento de blobs do Azure:
Configure uma assinatura da Event Grid para eventos de armazenamento Azure.
Crie uma integração de notificação no Snowflake. Uma integração de notificação é um objeto Snowflake que fornece uma interface entre o Snowflake e serviços de enfileiramento de mensagens de terceiros, como a Event Grid da Microsoft.
Crie um objeto de preparação nomeado (usando CREATE STAGE) que faça referência ao local externo (ou seja, o contêiner do Azure) em que seus arquivos de dados são armazenados.
Crie uma tabela externa (usando CREATE EXTERNAL TABLE) que faça referência ao estágio nomeado e à integração.
Atualize manualmente os metadados da tabela externa uma vez usando ALTER EXTERNAL TABLE … REFRESH para sincronizar os metadados com todas as alterações ocorridas após a Etapa 4. Depois disso, as notificações da Event Grid acionam automaticamente a atualização dos metadados.
Configure privilégios de controle de acesso ao Snowflake para quaisquer funções adicionais a fim de conceder-lhes acesso à tabela externa.
Consulta de tabelas externas¶
Consulte tabelas externas como você faria com as tabelas padrão.
O Snowflake omite resultados de consulta para registros que contêm dados UTF-8 inválidos. Após encontrar dados inválidos, o Snowflake continua a verificar o arquivo sem retornar uma mensagem de erro.
Para evitar registros ausentes nos resultados da sua consulta causados por dados inválidos UTF-8, especifique REPLACE_INVALID_CHARACTERS = TRUE
para o formato do seu arquivo. Isso substitui quaisquer caracteres inválidos UTF-8 pelo caractere de substituição Unicode (�
) quando você consulta a tabela.
Para arquivos Parquet, você também pode definir BINARY_AS_TEXT = FALSE
para o formato do seu arquivo de forma que o Snowflake interprete as colunas sem tipo de dados lógicos definido como dados binários em vez de texto UTF-8.
Filtragem de registros em arquivos Parquet¶
Para usar estatísticas de grupo de linhas para remover dados em arquivos Parquet, você pode incluir colunas de partição, colunas regulares ou ambas em uma cláusula WHERE. Aplicam-se as seguintes limitações:
A cláusula não pode incluir nenhuma coluna VARIANT.
A cláusula só pode incluir um ou mais dos seguintes operadores de comparação:
=
>
<
A cláusula só pode incluir um ou mais operadores lógicos/boolianos, assim como a função STARTSWITH SQL.
Além disso, consultas no formato "value:<path>::<data type>"
(ou a função equivalente GET/GET_PATH , :) usam o scanner vetorizado. Consultas no formato "value"
ou simplesmente "value:<path>"
são processadas usando o scanner não vetorizado. Converta todos os dados de fuso horário em um fuso horário padrão usando a função CONVERT_TIMEZONE para consultas que utilizam o scanner vetorizado.
Você pode obter melhores resultados de remoção quando os arquivos são classificados por uma chave incluída em um filtro de consulta e se houver vários grupos de linhas nos arquivos.
A tabela a seguir exibe estruturas de consulta semelhantes que mostram os comportamentos nesta seção, em que et
é uma tabela externa e c1
, c2
e c3
são colunas virtuais:
Otimizado |
Não otimizado |
---|---|
|
|
|
|
Resultados da consulta persistente¶
Similar às tabelas, os resultados da consulta para tabelas externas persistem durante 24 horas. Dentro deste período de 24 horas, as seguintes operações invalidam e limpam o cache de resultados da consulta para tabelas externas:
Qualquer operação DDL que modifique a definição da tabela externa. Isso inclui modificar explicitamente a definição da tabela externa (usando ALTER EXTERNAL TABLE) ou recriar a tabela externa (usando CREATE OR REPLACE EXTERNAL TABLE).
Alterações no conjunto de arquivos no armazenamento em nuvem que são registrados nos metadados da tabela externa. As operações de atualização automática usando o serviço de notificação de eventos para o local de armazenamento ou as operações de atualização manual (usando ALTER EXTERNAL TABLE … REFRESH) invalidam o cache de resultados.
Nota
Alterações nos arquivos referenciados no armazenamento em nuvem não invalidam o cache de resultados da consulta nas seguintes circunstâncias, que levam a resultados de consulta desatualizados:
A operação de atualização automática está desativada (ou seja, AUTO_REFRESH = FALSE) ou não está configurada corretamente.
Os metadados de tabela externa não são atualizados manualmente.
Exemplo: remover arquivos preparados mais antigos dos metadados de tabela externa¶
As etapas a seguir fornecem um exemplo de como você pode usar uma instrução ALTER EXTERNAL TABLE … REMOVE FILES para remover arquivos preparados mais antigos dos metadados em uma tabela externa. O procedimento armazenado remove os arquivos dos metadados com base na data da última modificação no preparo:
Crie o procedimento armazenado usando uma instrução CREATE PROCEDURE:
CREATE or replace PROCEDURE remove_old_files(external_table_name varchar, num_days float) RETURNS varchar LANGUAGE javascript EXECUTE AS CALLER AS $$ // 1. Get the relative path of the external table // 2. Find all files registered before the specified time period // 3. Remove the files var resultSet1 = snowflake.execute({ sqlText: `call exttable_bucket_relative_path('` + EXTERNAL_TABLE_NAME + `');` }); resultSet1.next(); var relPath = resultSet1.getColumnValue(1); var resultSet2 = snowflake.execute({ sqlText: `select file_name from table(information_schema.EXTERNAL_TABLE_FILES ( TABLE_NAME => '` + EXTERNAL_TABLE_NAME +`')) where last_modified < dateadd(day, -` + NUM_DAYS + `, current_timestamp());` }); var fileNames = []; while (resultSet2.next()) { fileNames.push(resultSet2.getColumnValue(1).substring(relPath.length)); } if (fileNames.length == 0) { return 'nothing to do'; } var alterCommand = `ALTER EXTERNAL TABLE ` + EXTERNAL_TABLE_NAME + ` REMOVE FILES ('` + fileNames.join(`', '`) + `');`; var resultSet3 = snowflake.execute({ sqlText: alterCommand }); var results = []; while (resultSet3.next()) { results.push(resultSet3.getColumnValue(1) + ' -> ' + resultSet3.getColumnValue(2)); } return results.length + ' files: \n' + results.join('\n'); $$; CREATE or replace PROCEDURE exttable_bucket_relative_path(external_table_name varchar) RETURNS varchar LANGUAGE javascript EXECUTE AS CALLER AS $$ var resultSet = snowflake.execute({ sqlText: `show external tables like '` + EXTERNAL_TABLE_NAME + `';` }); resultSet.next(); var location = resultSet.getColumnValue(10); var relPath = location.split('/').slice(3).join('/'); return relPath.endsWith("/") ? relPath : relPath + "/"; $$;
Chame o procedimento armazenado:
-- Remove all files from the exttable external table metadata: call remove_old_files('exttable', 0); -- Remove files staged longer than 90 days ago from the exttable external table metadata: call remove_old_files('exttable', 90);
Como alternativa, você pode criar uma tarefa usando CREATE TASK para chamar o procedimento armazenado periodicamente e remover arquivos antigos dos metadados de tabela externa.
Integração do metastore do Apache Hive¶
O Snowflake aceita a integração de metastores do Apache Hive com o Snowflake usando tabelas externas. O conector do Hive detecta eventos de metastore e os transmite ao Snowflake para manter as tabelas externas sincronizadas com o metastore do Hive. Com esse recurso, os usuários podem gerenciar seus dados no Hive enquanto os consultam no Snowflake.
Para obter instruções, consulte Integrar metastores do Apache Hive com o Snowflake.
DDL de tabela externa¶
Para apoiar a criação e o gerenciamento de tabelas externas, o Snowflake fornece o seguinte conjunto de comandos DDL especiais:
Privilégios de acesso obrigatórios¶
A criação e o gerenciamento de tabelas externas requer uma função com um mínimo das seguintes permissões de função:
Objeto |
Privilégio |
---|---|
Banco de dados |
USAGE |
Esquema |
USAGE CREATE STAGE (se estiver criando um novo estágio), CREATE EXTERNAL TABLE |
Estágio (se utilizando um estágio existente) |
USAGE |
Information Schema¶
O Snowflake Information Schema inclui exibições e funções de tabela que você pode consultar para obter informações sobre as tabelas externas e seus arquivos de dados preparados.
Exibição¶
- Exibição EXTERNAL_TABLES
Exibe informações de tabelas externas no banco de dados especificado (ou atual).
Funções de tabela¶
- AUTO_REFRESH_REGISTRATION_HISTORY
Recupere o histórico de arquivos de dados registrados nos metadados de objetos especificados e os créditos cobrados por essas operações.
- EXTERNAL_TABLE_FILES
Recupere informações sobre os arquivos de dados preparados incluídos nos metadados de uma tabela externa especificada.
- EXTERNAL_TABLE_FILE_REGISTRATION_HISTORY
Recupere informações sobre o histórico dos metadados para uma tabela externa, incluindo quaisquer erros encontrados ao atualizar os metadados.