Tutorial: carregamento em massa a partir do Amazon S3 usando COPY¶
Introdução¶
Este tutorial descreve como carregar em uma tabela dados de arquivos de um bucket existente do Amazon Simple Storage Service (Amazon S3). Neste tutorial, você aprenderá como:
Criar formatos de arquivos nomeados que descrevam seus arquivos de dados.
Criar objetos de preparação nomeados.
Carregar para as tabelas do Snowflake os dados localizados em seu bucket S3.
Resolver os erros em seus arquivos de dados.
O tutorial cobre o carregamento de dados CSV e JSON.
Pré-requisitos¶
O tutorial considera o seguinte:
Você tem uma conta Snowflake que está configurada para usar os Amazon Web Services (AWS) e um usuário com uma função que concede os privilégios necessários para criar um banco de dados, tabelas e objetos de warehouse virtual.
Você tem o SnowSQL instalado.
Consulte o Snowflake em 20 minutos para obter instruções para atender a estes requisitos.
O Snowflake fornece amostras de arquivos de dados em um bucket S3 público da Amazon para uso neste tutorial. Mas antes de começar, você precisa criar um banco de dados, tabelas e um warehouse virtual para este tutorial. Estes são os objetos básicos do Snowflake necessários para a maioria das atividades do Snowflake.
Sobre os arquivos de dados de amostra¶
O Snowflake fornece arquivos de dados de amostra preparados em um bucket S3 público.
Nota
Em uso regular, você prepararia seus próprios arquivos de dados usando o Console de gerenciamento da AWS, AWS Command Line Interface ou um aplicativo cliente equivalente. Consulte a documentação da Amazon Web Services para obter instruções.
Os arquivos de dados de amostra incluem informações de contato de amostra nos seguintes formatos:
Arquivos CSV que contêm uma linha de cabeçalho e cinco registros. O delimitador de campo é o caractere de canal (
|
). O exemplo a seguir mostra uma linha de cabeçalho e um registro:ID|lastname|firstname|company|email|workphone|cellphone|streetaddress|city|postalcode 6|Reed|Moses|Neque Corporation|eget.lacus@facilisis.com|1-449-871-0780|1-454-964-5318|Ap #225-4351 Dolor Ave|Titagarh|62631
Um único arquivo no formato JSON que contém uma matriz e três objetos. A seguir, um exemplo de uma matriz que contém um dos objetos:
[ { "customer": { "address": "509 Kings Hwy, Comptche, Missouri, 4848", "phone": "+1 (999) 407-2274", "email": "blankenship.patrick@orbin.ca", "company": "ORBIN", "name": { "last": "Patrick", "first": "Blankenship" }, "_id": "5730864df388f1d653e37e6f" } }, ]
Criação do banco de dados, tabelas e warehouses¶
Execute as seguintes instruções para criar um banco de dados, duas tabelas (para dados csv e json) e um warehouse virtual necessário para este tutorial. Depois de concluir o tutorial, você poderá descartar estes objetos.
CREATE OR REPLACE DATABASE mydatabase;
CREATE OR REPLACE TEMPORARY TABLE mycsvtable (
id INTEGER,
last_name STRING,
first_name STRING,
company STRING,
email STRING,
workphone STRING,
cellphone STRING,
streetaddress STRING,
city STRING,
postalcode STRING);
CREATE OR REPLACE TEMPORARY TABLE myjsontable (
json_data VARIANT);
CREATE OR REPLACE WAREHOUSE mywarehouse WITH
WAREHOUSE_SIZE='X-SMALL'
AUTO_SUSPEND = 120
AUTO_RESUME = TRUE
INITIALLY_SUSPENDED=TRUE;
Observe o seguinte:
A instrução
CREATE DATABASE
cria um banco de dados. O banco de dados inclui automaticamente um esquema chamado “public”.As instruções
CREATE TABLE
criam tabelas de destino para dados CSV e JSON. As tabelas são temporárias, ou seja, elas existem apenas durante a sessão do usuário e não ficam visíveis para os outros usuários.A instrução
CREATE WAREHOUSE
cria um warehouse inicialmente suspenso. A instrução também defineAUTO_RESUME = true
, que inicia automaticamente o warehouse quando você executa instruções SQL que exigem recursos computacionais.
Criação de objetos de formato de arquivo¶
Quando você carrega arquivos de dados de um bucket S3 em uma tabela, você deve descrever o formato do arquivo e especificar como os dados no arquivo devem ser interpretados e processados. Por exemplo, se você estiver carregando dados delimitados por barras verticais de um arquivo CSV, você deverá especificar que o arquivo usa o formato CSV com símbolos de barras verticais como delimitadores.
Quando você executa o comando COPY INTO <tabela>, você especifica esta informação de formato. Você pode especificar estas informações como opções no comando (por exemplo, TYPE = CSV
, FIELD_DELIMITER = '|'
etc.) ou pode especificar um objeto de formato de arquivo que contenha estas informações de formato. Você pode criar um objeto de formato de arquivo nomeado usando o comando CREATE FILE FORMAT.
Nesta etapa, você cria objetos de formato de arquivo descrevendo o formato dos dados de amostra CSV e JSON fornecidos para este tutorial.
Criação de um objeto de formato de arquivo para dados CSV¶
Execute o comando CREATE FILE FORMAT para criar o formato de arquivo mycsvformat
.
CREATE OR REPLACE FILE FORMAT mycsvformat
TYPE = 'CSV'
FIELD_DELIMITER = '|'
SKIP_HEADER = 1;
Onde:
TYPE = 'CSV'
indica o tipo de formato do arquivo de origem. CSV é o tipo de formato de arquivo padrão.FIELD_DELIMITER = '|'
indica que o caractere “|” é um separador de campo. O valor padrão é “,”.SKIP_HEADER = 1
indica que o arquivo de origem inclui uma linha de cabeçalho. O comando COPY ignora essas linhas de cabeçalho ao carregar dados. O valor padrão é 0.
Criação de um objeto de formato de arquivo para dados JSON¶
Execute o comando CREATE FILE FORMAT para criar o formato de arquivo myjsonformat
.
CREATE OR REPLACE FILE FORMAT myjsonformat TYPE = 'JSON' STRIP_OUTER_ARRAY = TRUE;
Onde:
TYPE = 'JSON'
indica o tipo de formato do arquivo de origem.STRIP_OUTER_ARRAY = TRUE
direciona o comando COPY para excluir os colchetes ([]) ao carregar dados na tabela.
Criar objetos de preparação¶
Um estágio especifica onde os arquivos de dados são armazenados (isto é, “preparados”) para que os dados nos arquivos possam ser carregados em uma tabela. Um estágio externo nomeado é um local de armazenamento em nuvem gerenciado pelo Snowflake. Um estágio externo referencia arquivos de dados armazenados em um bucket S3. Neste caso, estamos criando um estágio que faz referência aos arquivos de dados de amostra necessários para completar o tutorial.
A criação de um estágio externo nomeado é útil se você quiser que vários usuários ou processos façam o carregamento de arquivos. Se você planeja preparar arquivos de dados para carregamento feito somente por você, ou carregar somente em uma única tabela, então você pode preferir usar seu estágio de usuário ou o estágio de tabela. Para obter mais informações, consulte Carregamento em massa a partir do Amazon S3.
Nesta etapa, você cria estágios nomeados para os diferentes tipos de arquivos de dados de amostra.
Criação de um estágio para arquivos de dados CSV¶
Execute CREATE STAGE para criar o estágio my_csv_stage
:
CREATE OR REPLACE STAGE my_csv_stage
FILE_FORMAT = mycsvformat
URL = 's3://snowflake-docs';
Criação de um estágio para arquivos de dados JSON¶
Execute CREATE STAGE para criar o estágio my_json_stage
:
CREATE OR REPLACE STAGE my_json_stage
FILE_FORMAT = myjsonformat
URL = 's3://snowflake-docs';
Nota
Em uso regular, se você estivesse criando um estágio que apontasse para seus arquivos de dados privados, você faria referência a uma integração de armazenamento criada usando CREATE STORAGE INTEGRATION por um administrador de conta (ou seja, um usuário com a função ACCOUNTADMIN) ou uma função com o privilégio global CREATE INTEGRATION:
CREATE OR REPLACE STAGE external_stage FILE_FORMAT = mycsvformat URL = 's3://private-bucket' STORAGE_INTEGRATION = myint;
Copiar dados para a tabela de destino¶
Execute COPY INTO <tabela> para carregar dados preparados nas tabelas de destino.
CSV¶
Para carregar os dados dos arquivos CSV de amostra:
Comece carregando os dados de um dos arquivos no prefixo
/tutorials/dataloading/
(pasta) chamadocontacts1.csv
na tabelamycsvtable
. Execute o seguinte:COPY INTO mycsvtable FROM @my_csv_stage/tutorials/dataloading/contacts1.csv ON_ERROR = 'skip_file';
Onde:
A cláusula
FROM
especifica a localização do arquivo de dados preparado (nome do estágio seguido do nome do arquivo).A cláusula
ON_ERROR = 'skip_file'
especifica o que fazer quando o comando COPY encontra erros nos arquivos. Se o comando encontrar um erro de dados em qualquer um dos registros, ele ignorará o arquivo. Se você não especificar uma cláusula ON_ERROR, o padrão seráabort_statement
, o que aborta o comando COPY no primeiro erro encontrado em qualquer um dos registros de um arquivo.
O comando COPY retorna um resultado mostrando o nome do arquivo copiado e informações relacionadas:
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+ | file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name | |---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------| | s3://snowflake-docs/tutorials/dataloading/contacts1.csv | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL | +---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
Carregue o resto dos arquivos preparados na tabela
mycsvtable
.O exemplo a seguir usa a correspondência de padrões para carregar dados de arquivos que correspondem à expressão regular
.*contacts[1-5].csv
para a tabelamycsvtable
.COPY INTO mycsvtable FROM @my_csv_stage/tutorials/dataloading/ PATTERN='.*contacts[1-5].csv' ON_ERROR = 'skip_file';
Em que a cláusula
PATTERN
especifica que o comando deve carregar dados dos nomes dos arquivos que correspondem a esta expressão regular.*contacts[1-5].csv
.O comando COPY retorna um resultado mostrando o nome do arquivo copiado e informações relacionadas:
+---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+ | file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name | |---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------| | s3://snowflake-docs/tutorials/dataloading/contacts2.csv | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL | | s3://snowflake-docs/tutorials/dataloading/contacts3.csv | LOAD_FAILED | 5 | 0 | 1 | 2 | Number of columns in file (11) does not match that of the corresponding table (10), use file format option error_on_column_count_mismatch=false to ignore this error | 3 | 1 | "MYCSVTABLE"[11] | | s3://snowflake-docs/tutorials/dataloading/contacts4.csv | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL | | s3://snowflake-docs/tutorials/dataloading/contacts5.csv | LOADED | 6 | 6 | 1 | 0 | NULL | NULL | NULL | NULL | +---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+
Observe os seguintes destaques no resultado:
Os dados em
contacts1.csv
são ignorados porque você já carregou os dados com sucesso.Os dados contidos nestes arquivos foram carregados com sucesso:
contacts2.csv
,contacts4.csv
econtacts5.csv
.Os dados em
contacts3.csv
foram ignorados devido a 2 erros de dados. A próxima etapa neste tutorial trata de como validar e corrigir os erros.
JSON¶
Carregue o arquivo de dados preparado contacts.json
na tabela myjsontable
.
COPY INTO myjsontable FROM @my_json_stage/tutorials/dataloading/contacts.json ON_ERROR = 'skip_file';
O COPY retorna um resultado mostrando o nome do arquivo copiado e informações relacionadas:
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
| file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
|---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
| s3://snowflake-docs/tutorials/dataloading/contacts.json | LOADED | 3 | 3 | 1 | 0 | NULL | NULL | NULL | NULL |
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
Limpeza¶
Parabéns, você concluiu esse tutorial com sucesso.
Tutorial de limpeza (opcional)¶
Execute os seguintes comandos DROP <objeto> para retornar o sistema ao seu estado antes de iniciar o tutorial:
DROP DATABASE IF EXISTS mydatabase; DROP WAREHOUSE IF EXISTS mywarehouse;
Descartar o banco de dados remove automaticamente todos os objetos do banco de dados filho, tais como tabelas.