Visão geral do carregamento de dados¶
Este tópico fornece uma visão geral das principais opções disponíveis para carregar dados no Snowflake.
Para medir com facilidade e precisão a latência de ingestão dos seus pipelines de dados, use carimbos de data/hora de linha. Para obter mais informações, consulte Usar carimbos de data/hora de linha para medir a latência em seus pipelines.
Locais de arquivos suportados¶
Snowflake refere-se ao local dos arquivos de dados no armazenamento em nuvem como um estágio. O comando COPY INTO <tabela> usado para cargas de dados em massa e contínuas (Snowpipe) oferece suporte a contas de armazenamento em nuvem gerenciadas por sua entidade comercial (estágios externos), bem como ao armazenamento em nuvem contido em sua conta Snowflake (estágios internos).
Estágios externos¶
O carregamento de dados de qualquer um dos seguintes serviços de armazenamento em nuvem é suportado independentemente da plataforma de nuvem que hospeda sua conta Snowflake:
Amazon S3
Google Cloud Storage
Microsoft Azure
Não é possível acessar dados mantidos em classes de armazenamento em nuvem que exigem restauração antes que possam ser recuperados. Estas classes de armazenamento de arquivos incluem, por exemplo, a Amazon S3 Glacier Flexible Retrieval ou Glacier Deep Archive, o ainda o Microsoft Azure Archive Storage.
Faça o upload (ou seja, preparo) de arquivos para sua conta de armazenamento em nuvem usando as ferramentas fornecidas pelo serviço de armazenamento em nuvem.
Um estágio externo nomeado é um objeto de banco de dados criado em um esquema. Esse objeto armazena o URL para arquivos no armazenamento em nuvem, as configurações usadas para acessar a conta de armazenamento em nuvem e as configurações de conveniência, tais como as opções que descrevem o formato dos arquivos preparados. Crie estágios usando o comando CREATE STAGE.
Nota
Algumas cobranças por transferência de dados podem ser aplicadas ao carregar dados de arquivos em um serviço de armazenamento em nuvem em uma região ou plataforma de nuvem diferente de sua conta Snowflake. Para obter mais informações, consulte Explicação do custo de transferência de dados.
Estágios internos¶
O Snowflake mantém os seguintes tipos de estágios em sua conta:
- Usuário:
Um estágio do usuário é alocado a cada usuário para o armazenamento de arquivos. Este tipo de estágio é projetado para armazenar arquivos que são preparados e gerenciados por um único usuário, mas que podem ser carregados em várias tabelas. Os estágios do usuário não podem ser alterados ou descartados.
- Tabela:
Para cada tabela criada no Snowflake está disponível um estágio de tabela. Este tipo de estágio é projetado para armazenar arquivos que são preparados e gerenciados por um ou mais usuários, mas apenas carregados em uma única tabela. Os estágios da tabela não podem ser alterados ou descartados.
Note que um estágio da tabela não é um objeto separado do banco de dados; ao contrário, ele é um estágio implícito ligado à própria tabela. Um estágio da tabela não tem privilégios próprios. Para o preparo de arquivos em um estágio de tabela, listar os arquivos, consultá-los no estágio ou descartá-los, você deve ser o proprietário da tabela (ter a função com o privilégio OWNERSHIP sobre a tabela).
- Nomeado:
Um estágio interno nomeado é um objeto de banco de dados criado em um esquema. Este tipo de estágio pode armazenar arquivos que são preparados e gerenciados por um ou mais usuários e carregados em uma ou mais tabelas. Como os estágios nomeados são objetos de banco de dados, a capacidade de criá-los, modificá-los, usá-los ou descartá-los pode ser controlada por meio de privilégios de controle de acesso de segurança. Crie estágios usando o comando CREATE STAGE.
Faça o upload de arquivos para qualquer um dos tipos de estágio interno a partir de seu sistema local de arquivos usando o comando PUT.
Carregamento em massa vs. carregamento contínuo¶
O Snowflake fornece as seguintes soluções principais para o carregamento de dados. A melhor solução pode depender do volume de dados a serem carregados e da frequência do carregamento.
Carregamento em massa usando o comando COPY¶
Esta opção permite carregar lotes de dados de arquivos já disponíveis no armazenamento em nuvem ou copiar (ou seja, preparação) arquivos de dados de uma máquina local para um local de armazenamento em nuvem interno (ou seja, o Snowflake) antes de carregar os dados em tabelas usando o comando COPY.
Recursos de computação¶
O carregamento em massa depende de warehouses virtuais fornecidos pelo usuário, que são especificados na instrução COPY. Os usuários são obrigados a dimensionar o warehouse adequadamente para acomodar os carregamentos previstos.
Transformações simples durante um carregamento¶
O Snowflake oferece suporte à transformação de dados ao carregá-los em uma tabela usando o comando COPY. As opções incluem:
Reordenação de colunas
Omissão de coluna
Conversões
Truncamento de cadeias de caracteres de texto que excedam o comprimento da coluna de destino
Não há exigência de que seus arquivos de dados tenham o mesmo número e ordenação de colunas que sua tabela de destino.
Carregamento contínuo usando o Snowpipe¶
Esta opção é projetada para carregar pequenos volumes de dados (ou seja, microlotes) e disponibilizá-los incrementalmente para análise. O Snowpipe carrega os dados em minutos após os arquivos serem adicionados a um estágio e enviados para ingestão. Isso garante que os usuários tenham os resultados mais recentes, assim que os dados brutos estiverem disponíveis.
Recursos de computação¶
O Snowpipe utiliza recursos computacionais fornecidos pelo Snowflake (ou seja, um modelo computacional sem servidor). Esses recursos fornecidos pelo Snowflake são automaticamente redimensionados e escalonados para cima ou para baixo, conforme necessário, e são cobrados e discriminados usando o faturamento por segundo. A ingestão de dados é cobrada com base nas cargas de trabalho reais.
Transformações simples durante um carregamento¶
A instrução COPY em uma definição de canal é compatível com as mesmas opções de transformação COPY que durante o carregamento de dados em massa.
Além disso, os pipelines de dados podem aproveitar o Snowpipe para carregar continuamente microlotes de dados em tabelas de estágio, para transformação e otimização usando tarefas automatizadas, e as informações de captura de dados de alteração (CDC) em fluxos.
Carregamento contínuo usando o Snowpipe Streaming¶
O API Snowpipe Streaming escreve linhas de dados diretamente nas tabelas Snowflake sem a exigência de arquivos de preparação. Esta arquitetura resulta em latências de carga mais baixas, com custos correspondentes mais baixos para carregar qualquer volume de dados, o que a torna uma ferramenta poderosa para lidar com fluxos de dados quase em tempo real.
O Snowpipe Streaming também está disponível para o conector Snowflake para Kafka, que oferece um caminho fácil de atualização para aproveitar a menor latência e as cargas de menor custo.
Para obter mais informações, consulte Snowpipe Streaming.
Carregamento de dados de tópicos do Apache Kafka¶
O Conector Snowflake para Kafka permite que os usuários se conectem a um servidor Apache Kafka, leiam dados de um ou mais tópicos e carreguem esses dados nas tabelas do Snowflake.
Registro de erros de DML¶
Quando você executa um conjunto de instruções DML e uma das instruções falha com um erro, a operação DML é encerrada, e as alterações feitas pela instrução DML são revertidas. Se você quiser continuar a executar o restante das instruções DML e registrar o erro ocorrido, pode ativar o registro de erros de DML na tabela. A tabela em que o registro de erros de DML está ativado é chamada de tabela base. Os erros são registrados em uma tabela de erros associada à tabela base.
O registro de erros de DML é ativado em uma tabela somente quando as duas condições abaixo são atendidas:
A propriedade ERROR_LOGGING está definida como
TRUEna tabela.O parâmetro OPT_OUT_ERROR_LOGGING está definido como
FALSEna sessão atual.
O registro de erros de DML é desativado em uma tabela somente quando qualquer uma das condições abaixo é atendida:
A propriedade ERROR_LOGGING está definida como
FALSEna tabela.O parâmetro OPT_OUT_ERROR_LOGGING está definido como
TRUEna sessão atual.
As seguintes seções apresentam mais informações sobre o registro de erros de DML:
Casos de uso para registro de erros de DML¶
Você pode usar o registro de erros de DML para evitar falhas em caso de erros nos seguintes casos de uso:
Migração de dados de terceiros que depende do registro de erros de DML, como dados de um banco de dados Oracle.
Aplicação de algumas restrições de tabela, como NOT NULL, durante a ingestão de dados.
Configurar o registro de erros de DML em uma tabela¶
Você pode ativar ou desativar o registro de erros de DML em uma tabela padrão do Snowflake ou uma tabela Iceberg gerenciada pelo Snowflake quando cria ou altera a tabela.
Para ativar ou desativar o registro de erros em uma tabela, use os seguintes comandos SQL para definir a propriedade ERROR_LOGGING na tabela:
CREATE ICEBERG TABLE (somente gerenciada pelo Snowflake)
ALTER ICEBERG TABLE (somente gerenciada pelo Snowflake)
Os exemplos a seguir configuram o registro de erros de DML nas tabelas e mostra como os erros são registrados em tabelas de erros:
Os exemplos a seguir configuram o registro de erros de DML nas tabelas e mostra como os erros são registrados em tabelas de erros:
Registrar erros ao inserir linhas diretamente¶
O seguinte exemplo registra os erros ao inserir as linhas diretamente em uma tabela:
Crie uma tabela e ative o registro de erros de DML nela:
Execute uma instrução INSERT que tenta inserir várias linhas, incluindo valores válidos e inválidos:
Consulte a tabela para confirmar que uma linha válida foi inserida:
Consulte a tabela de erros da tabela base
test_dml_error_loggingpara ver os erros que foram registrados:Desative o registro de erros de DML da tabela
test_dml_error_logging:Tente a mesma instrução INSERT que você já executou. Um erro é retornado e nenhum erro é registrado em uma tabela de erros:
Registrar erros ao inserir linhas de uma tabela em outra¶
O seguinte exemplo registra erros ao inserir linhas de uma tabela em outra:
Crie uma tabela de origem e insira os valores:
Crie uma tabela de destino com a mesma definição da tabela de origem:
Ative o registro de erros de DML na tabela
dml_error_logging_target:Insira os valores na tabela de destino consultando a tabela de origem para que uma das inserções resulte em um erro de divisão por zero:
Consulte a tabela para confirmar que duas linhas válidas foram inseridas:
Consulte a tabela de erros da tabela base
dml_error_logging_targetpara ver os erros que foram registrados:
Registro e tabelas de erros¶
Quando o registro de erros é ativado em uma tabela, o Snowflake cria automaticamente uma tabela de erros associada à tabela base. As operações DML que encontram erros compatíveis os registram na tabela de erros em vez de falhar.
Quando o registro de erros de DML está ativado em uma tabela, os seguintes tipos de instruções DML são registrados:
INSERT de tabela única
UPDATE
MERGE
As tabelas de erros têm uma definição fixa e só podem ser acessadas pelo proprietário da tabela base ou por um usuário com uma função que tenha recebido o privilégio SELECT ERROR TABLE na tabela base. As únicas operações diretas compatíveis com uma tabela de erros são as instruções SELECT e TRUNCATE. Não é possível executar outros tipos de instruções diretamente em tabelas de erros. As tabelas de erros não podem ser usadas indiretamente em exibições materializadas ou tabelas dinâmicas.
Você pode copiar os dados da tabela de erros para outras tabelas. Você pode remover os dados de uma tabela de erros executando o comando TRUNCATE.
As seguintes seções apresentam mais informações sobre registro e tabelas de erros:
Definição das tabelas de erros¶
O Snowflake cria tabelas de erros com uma definição padrão que não pode ser modificada.
Quando você desativa o registro de erros de DML de uma tabela base ou descarta uma tabela base que tem uma tabela de erros, a tabela de erros associada à tabela base é descartada automaticamente.
Uma tabela de erros tem as seguintes colunas:
Nome |
Tipo |
Descrição |
|---|---|---|
|
TIMESTAMP |
O carimbo de data/hora da instrução que acionou o erro. |
|
VARCHAR |
O ID exclusivo da instrução que acionou o erro. |
|
NUMBER |
O código de erro. Quando várias colunas em uma linha contêm erros, esta coluna captura apenas o primeiro erro encontrado. |
|
OBJECT |
Os metadados do erro. Os valores OBJECT têm a seguinte estrutura: Os valores OBJECT contêm os seguintes pares chave-valor:
Quando várias colunas em uma linha contêm erros, esta coluna captura apenas o primeiro erro encontrado. |
|
OBJECT |
Os dados que causaram o erro. Os valores OBJECT têm a seguinte estrutura: Os valores OBJECT contêm os pares chave-valor que representam cada coluna na tabela base. A chave é o nome da coluna. Para os valores de coluna inválidos que causaram a falha na operação DML, o valor no par chave-valor é uma matriz que contém os valores. Os valores válidos são mostrados diretamente; ou seja, não são mostrados em matrizes. Se os dados não puderem ser representados em um valor OBJECT, o valor será NULL. |
Interagir com tabelas de erros¶
Você pode executar instruções SELECT e TRUNCATE em tabelas de erros usando a seguinte sintaxe:
Onde:
base_table_nameO nome da tabela para a qual a tabela de erros foi criada.
Por exemplo, se o nome da tabela base é my_table, a seguinte instrução consulta a tabela de erros desta tabela base:
A seguinte instrução trunca a tabela de erros:
Requisitos de controle de acesso para tabelas de erros¶
Qualquer função que possa inserir em uma tabela base pode acionar inserções na respectiva tabela de erros. Independentemente da função atual, inserções diretas em uma tabela de erros não são permitidas.
Os seguintes usuários podem executar instruções SELECT em uma tabela de erros:
O proprietário da tabela base da tabela de erros.
Os usuários que receberam o privilégio SELECT ERROR TABLE na tabela base, seja por meio de uma função ou diretamente.
Para conceder o privilégio SELECT ERROR TABLE em uma tabela base, execute a instrução GRANT <privilégios> … TO ROLE ou GRANT <privilégios> … TO USER.
Essas instruções usam a seguinte sintaxe:
Por exemplo, para conceder o privilégio SELECT ERROR TABLE em uma tabela base chamada
mybasetablea uma função chamadamyrole, execute a seguinte instrução:
Alternativamente, para conceder a outras funções acesso a uma tabela de erros, o proprietário da tabela base também pode criar uma exibição baseada na tabela de erros e conceder acesso a essa exibição.
Metadados para registro de erros¶
Para determinar se o registro de erros está ativado em uma tabela, você pode executar a função GET_DDL e passar o nome da tabela base:
Por exemplo, para uma tabela base chamada test_dml_error_logging no esquema atual, execute a seguinte instrução:
As métricas das tabelas de erros são registradas nas seguintes exibições:
Fluxos em tabelas de erros¶
Fluxos não são diretamente compatíveis com tabelas de erros. Para habilitar o rastreamento de alterações em tabelas de erros, primeiro crie uma exibição na tabela de erros e, em seguida, crie um fluxo na exibição.
O seguinte exemplo mostra como habilitar o rastreamento de alterações em tabelas de erros:
Execute o comando CREATE VIEW para criar uma exibição na tabela de erros:
Execute o comando CREATE STREAM para criar um fluxo na exibição:
Notas de uso do registro de erros de DML¶
As seguintes notas de uso se aplicam quando o registro de erros está ativado em uma tabela:
Somente os erros diretamente relacionados à tabela base são registrados.
Os seguintes tipos de erros são registrados:
Violações de restrição de tabela NOT NULL.
Erros de conversão de tipo que ocorrem ao tentar converter um valor de ou na coluna da tabela base.
Valores de precisão e escala incompatíveis.
Comprimento incompatível com tipos de cadeia de caracteres e binários.
Algumas falhas na avaliação de expressão, como divisão por zero ou falhas na função PARSE_JSON.
As instruções INSERT e CREATE TABLE … AS SELECT (CTAS) de várias tabelas são executadas normalmente. Elas falham em caso de erros de DML e não os registra.
Se você tentar executar uma instrução COPY INTO em uma tabela com o registro de erros habilitado, o erro
Error logging is not supported in statement 'COPY INTO'será retornado no momento da compilação.Erros que não são compatíveis com o registro de erros de DML provocam uma falha diretamente na operação DML.
Se uma instrução SQL resultar em um erro de compilação, a operação será encerrada, e nenhum erro será registrado na tabela de erros.
Falhas que ocorrem em outros caminhos de ingestão, como COPY e Snowpipe, não são registradas em tabelas de erros. Para registro de erros de alto desempenho do Snowpipe Streaming, consulte Registro de erros no Snowpipe Streaming com arquitetura de alto desempenho.
Veja a seguir considerações relacionadas ao registro de erros e ao desempenho de DML:
Quando o registro de erros de DML está habilitado em uma tabela base, e não há erros em uma instrução DML executada na tabela base, nenhuma ou muito pouca diferença de desempenho é esperada.
Quando o registro de erros de DML está habilitado em uma tabela base e há erros em uma instrução DML executada na tabela base, é necessário um tempo adicional para concluir a instrução DML porque as informações do erro são inseridas na tabela de erros.
Quando uma tabela base com uma tabela de erros associada é clonada, o comportamento é o seguinte:
O esquema e o conteúdo da tabela base são clonados.
O conteúdo da tabela de erros não é clonado.
A tabela base clonada tem a propriedade ERROR_LOGGING ativada, o que implicitamente cria uma tabela de erros vazia para ela.
Detecção de esquema de definições de coluna a partir de arquivos de dados semiestruturados preparados¶
Os dados semiestruturados podem incluir milhares de colunas. O Snowflake fornece soluções robustas para o tratamento desses dados. As opções incluem fazer referência aos dados diretamente no armazenamento em nuvem usando tabelas externas, carregar os dados em uma única coluna do tipo VARIANT ou transformar e carregar os dados em colunas separadas em uma tabela relacional padrão. Todas essas opções exigem algum conhecimento das definições das colunas nos dados.
Uma solução diferente envolve a detecção automática do esquema em um conjunto de arquivos de dados semiestruturados preparados e a recuperação das definições das colunas. As definições das colunas incluem os nomes, tipos de dados e ordenação das colunas nos arquivos. Gere sintaxe em um formato adequado para criar tabelas, tabelas externas ou exibições padrão do Snowflake.
Nota
Este recurso oferece suporte aos arquivos Apache Parquet, Apache Avro, ORC, JSON e CSV.
Esse suporte é implementado por meio das seguintes funções SQL:
- INFER_SCHEMA
Detecta as definições de coluna em um conjunto de arquivos de dados preparados e recupera os metadados em um formato adequado para a criação de objetos Snowflake.
- GENERATE_COLUMN_DESCRIPTION
Gera uma lista de colunas a partir de um conjunto de arquivos preparados usando a saída da função INFER_SCHEMA.
Estas funções SQL oferecem suporte tanto aos estágios internos quanto aos externos.
Crie tabelas ou tabelas externas com as definições das colunas derivadas de um conjunto de arquivos preparados usando a sintaxe CREATE TABLE … USING TEMPLATE ou CREATE EXTERNAL TABLE … USING TEMPLATE A cláusula USING TEMPLATE aceita uma expressão que chama a função INFER_SCHEMA SQL para detectar as definições de coluna nos arquivos. Ao concluir a criação da tabela, você poderá então usar uma instrução COPY com a opção MATCH_BY_COLUMN_NAME para carregar os arquivos diretamente na tabela estruturada.
A detecção de esquema também pode ser usada em conjunto com a evolução do esquema de tabela, onde a estrutura das tabelas evolui automaticamente para oferecer suporte à estrutura de novos dados recebidos das fontes de dados.
Alternativas ao carregamento de dados¶
Você pode usar a seguinte opção para consultar seus dados no armazenamento em nuvem sem carregá-los nas tabelas do Snowflake.
Tabelas externas (data lake)¶
As tabelas externas permitem consultar os dados existentes armazenados no armazenamento externo em nuvem para análise sem primeiro carregá-los no Snowflake. A fonte confiável para os dados permanece no armazenamento externo em nuvem. Os conjuntos de dados materializados no Snowflake por meio de exibições materializadas são somente leitura.
Esta solução é especialmente benéfica para contas que têm uma grande quantidade de dados armazenados em armazenamento externo em nuvem e só querem consultar uma parte dos dados, por exemplo, os dados mais recentes. Os usuários podem criar exibições materializadas sobre subconjuntos destes dados para melhorar o desempenho das consultas.
Como trabalhar com armazenamento compatível com Amazon S3¶
Você pode criar estágios e tabelas externas no Snowflake para acessar o armazenamento em um aplicativo ou dispositivo compatível com o Amazon S3. Esse recurso permite que você gerencie, controle e analise seus dados, independentemente de onde dados estejam armazenados. Para obter mais informações, consulte Work with Amazon S3-compatible storage.