Carregamento de dados¶
Este tópico fornece práticas recomendadas, diretrizes gerais e considerações importantes para o carregamento de dados preparados.
Neste tópico:
Opções para seleção de arquivos de dados preparados¶
O comando COPY oferece suporte a várias opções para carregar arquivos de dados a partir de um estágio:
Por caminho (estágios internos) / prefixo (bucket Amazon S3). Para obter mais informações, consulte Organização dos dados por caminho.
Especificação de uma lista de arquivos específicos para carregar.
Uso da correspondência de padrões para identificar arquivos específicos por padrão.
Estas opções permitem copiar uma fração dos dados preparados no Snowflake com um único comando. Isso permite executar instruções COPY simultâneas que correspondem a um subconjunto de arquivos, tirando proveito de operações paralelas.
Listas de arquivos¶
O comando COPY INTO <tabela> inclui um parâmetro FILES para carregar arquivos por nome específico.
Dica
Das três opções para identificar/especificar arquivos de dados para carregar a partir de um estágio, fornecer uma lista discreta de arquivos geralmente é a mais rápida; entretanto, o parâmetro FILES oferece suporte a um máximo de 1.000 arquivos, significando que um comando COPY executado com o parâmetro FILES só pode carregar até 1.000 arquivos.
Por exemplo:
COPY INTO load1 FROM @%load1/data1/ FILES=('test1.csv', 'test2.csv', 'test3.csv')
As listas de arquivos podem ser combinadas com caminhos para maior controle sobre o carregamento de dados.
Correspondência de padrões¶
O comando COPY INTO <tabela> inclui um parâmetro PATTERN para carregar arquivos usando uma expressão regular.
Por exemplo:
COPY INTO people_data FROM @%people_data/data1/ PATTERN='.*person_data[^0-9{1,3}$$].csv';
A correspondência de padrões usando uma expressão regular geralmente é a mais lenta das três opções para identificar/especificar arquivos de dados para carregar a partir de um estágio; no entanto, esta opção funciona bem se você exportou seus arquivos em ordem nomeada a partir de seu aplicativo externo e deseja carregar os arquivos em lote na mesma ordem.
A correspondência de padrões pode ser combinada com caminhos para maior controle sobre o carregamento de dados.
Nota
A expressão regular é aplicada de forma diferente a carregamentos de dados em massa versus carregamentos de dados Snowpipe.
O Snowpipe reduz qualquer segmento do caminho na definição do estágio a partir do local de armazenamento e aplica a expressão regular a quaisquer segmentos de caminho e nomes de arquivo restantes. Para ver a definição do estágio, execute o comando DESCRIBE STAGE para o estágio. A propriedade do URL consiste no nome do bucket ou contêiner e zero ou mais segmentos de caminho. Por exemplo, se o local FROM em uma instrução COPY INTO <tabela> for
@s/path1/path2/
e o valor do URL para o estágio@s
fors3://mybucket/path1/
, o Snowpipe reduzirá o/path1/
do local de armazenamento na cláusula FROM e aplicará a expressão regular apath2/
mais os nomes dos arquivos no caminho.As operações de carregamento de dados em massa aplicam a expressão regular a todo o local de armazenamento na cláusula FROM.
O Snowflake recomenda que você habilite a filtragem de eventos da nuvem para o Snowpipe para reduzir custos, ruído de eventos e latência. Use a opção PATTERN somente quando o recurso de filtragem de eventos de seu provedor de nuvem não for suficiente. Para obter mais informações sobre a configuração da filtragem de eventos para cada provedor de nuvem, consulte as seguintes páginas:
Execução de instruções COPY paralelas que fazem referência aos mesmos arquivos de dados¶
Quando uma instrução COPY é executada, o Snowflake define um status de carregamento nos metadados da tabela para os arquivos de dados referenciados na instrução. Isso evita que instruções COPY paralelas carreguem os mesmos arquivos na tabela, evitando a duplicação de dados.
Quando o processamento da instrução COPY é concluído, o Snowflake ajusta o status do carregamento dos arquivos de dados conforme apropriado. Se um ou mais arquivos de dados não forem carregados, o Snowflake definirá o status de carregamento desses arquivos como falha de carregamento. Esses arquivos estão disponíveis para uma instrução COPY subsequente a ser carregada.
Carregamento de arquivos mais antigos¶
Esta seção descreve como o comando COPY INTO <tabela> evita a duplicação de dados de forma diferente com base no fato de o status de carregamento de um arquivo ser conhecido ou desconhecido. Se você dividir seus dados em estágios usando caminhos lógicos e granulares por data (como recomendado em Organização dos dados por caminho) e carregar os dados dentro de um curto espaço de tempo após a preparação, esta seção em grande parte não se aplica a você. Entretanto, se o comando COPY ignorar arquivos mais antigos (isto é, arquivos de dados históricos) em um carregamento de dados, esta seção descreve como contornar o comportamento padrão.
Metadados de carregamento¶
O Snowflake mantém metadados detalhados para cada tabela na qual os dados são carregados, incluindo:
Nome de cada arquivo a partir do qual os dados foram carregados
Tamanho do arquivo
ETag para o arquivo
Número de linhas analisadas no arquivo
Carimbo de data/hora do último carregamento do arquivo
Informações sobre quaisquer erros encontrados no arquivo durante o carregamento
Esses metadados de carregamento expiram após 64 dias. Se a data LAST_MODIFIED de um arquivo de dados preparado for menor ou igual a 64 dias, o comando COPY pode determinar seu status de carregamento para uma determinada tabela e evitar o recarregamento (e duplicação de dados). A data LAST_MODIFIED é o carimbo de data/hora em que o arquivo foi inicialmente preparado ou quando foi modificado pela última vez, o que for mais tarde.
Se a data LAST_MODIFIED for anterior a 64 dias, o status do carregamento ainda será conhecido se um dos seguintes eventos ocorrer menos ou igual a 64 dias antes da data atual:
O arquivo foi carregado com sucesso.
O conjunto inicial de dados da tabela (ou seja, o primeiro lote após a criação da tabela) foi carregado.
Entretanto, o comando COPY não pode determinar definitivamente se um arquivo já foi carregado se a data LAST_MODIFIED é mais antiga que 64 dias e o conjunto inicial de dados foi carregado na tabela mais de 64 dias antes (e se o arquivo foi carregado na tabela, o que também ocorreu mais de 64 dias antes). Nesse caso, para evitar recarregamento acidental, o comando ignora o arquivo por padrão.
Soluções alternativas¶
Para carregar arquivos cujos metadados tenham expirado, defina a opção de cópia LOAD_UNCERTAIN_FILES como verdadeira. A opção de cópia faz referência aos metadados de carregamento, se disponíveis, para evitar duplicação de dados, mas também tenta carregar arquivos com metadados de carregamento expirados.
Alternativamente, defina a opção FORCE para carregar todos os arquivos, ignorando os metadados de carregamento se eles existirem. Note que esta opção recarrega os arquivos, potencialmente duplicando dados em uma tabela.
Exemplos¶
Neste exemplo:
Uma tabela é criada em 1º de janeiro e o carregamento inicial da tabela ocorre no mesmo dia.
Então 64 dias se passam. Em 7 de março, os metadados de carregamento expiram.
Um arquivo é preparado e carregado na tabela em 27 de julho e 28 de julho, respectivamente. Como o arquivo foi preparado um dia antes de ser carregado, a data LAST_MODIFIED estava dentro de 64 dias. O status do carregamento era conhecido. Não há dados ou problemas de formatação com o arquivo e o comando COPY carrega o arquivo com sucesso.
Então 64 dias se passam. Em 28 de setembro, a data LAST_MODIFIED do arquivo preparado excede 64 dias. Os metadados de carga para o carregamento bem-sucedido de arquivos expiram em setembro de 2029.
É feita uma tentativa de recarregar o arquivo na mesma tabela em 1º de novembro. Como o comando COPY não pode determinar se o arquivo já foi carregado, o arquivo é ignorado. A opção de cópia LOAD_UNCERTAIN_FILES (ou a opção de cópia FORCE) é necessária para carregar o arquivo.
Neste exemplo:
Um arquivo é preparado em 1º de janeiro.
Então 64 dias se passam. Em 7 de março, a data LAST_MODIFIED do arquivo preparado excede 64 dias.
Uma nova tabela é criada em 29 de setembro e o arquivo preparado é carregado na tabela. Como o carregamento inicial da tabela ocorreu menos de 64 dias antes, o comando COPY pode determinar que o arquivo ainda não tinha sido carregado. Não há dados ou problemas de formatação com o arquivo e o comando COPY carrega o arquivo com sucesso.
Dados JSON: remoção de valores “nulos”¶
Em uma coluna VARIANT, os valores NULL são armazenados como uma cadeia de caracteres contendo a palavra “nulo” e não o valor SQL NULL. Se os valores “nulos” em seus documentos JSON indicam valores ausentes e não têm outro significado especial, recomendamos definir a opção de formato de arquivo STRIP_NULL_VALUES para TRUE para o comando COPY INTO <tabela> ao carregar os arquivos JSON. A retenção dos valores “nulos” muitas vezes desperdiça o armazenamento e retarda o processamento da consulta.
Dados CSV: corte de espaços à esquerda¶
Se seu software externo exporta campos entre aspas mas insere um espaço antes do caractere de aspas para cada campo, o Snowflake lê esse espaço em vez do caractere de aspas como o início do campo. Os caracteres de aspas são interpretados como dados de cadeia de caracteres.
Use a opção de formato de arquivo TRIM_SPACE para remover espaços indesejáveis durante o carregamento de dados.
Por exemplo, cada um dos seguintes campos em um arquivo CSV de amostra inclui um espaço à esquerda:
"value1", "value2", "value3"
O comando COPY a seguir corrige o espaço à esquerda e remove as aspas que delimitam cada campo:
COPY INTO mytable
FROM @%mytable
FILE_FORMAT = (TYPE = CSV TRIM_SPACE=true FIELD_OPTIONALLY_ENCLOSED_BY = '0x22');
SELECT * FROM mytable;
+--------+--------+--------+
| col1 | col2 | col3 |
+--------+--------+--------+
| value1 | value2 | value3 |
+--------+--------+--------+