Do S3 até o Snowflake, utilizando apenas SQL
Muita gente, ao precisar carregar dados que estão em um cloud storage (S3, Azure Blob, Google Cloud Storage) para um Data Warehouse, imediatamente pensa: “preciso de uma ferramenta de ETL”.
Apache Hop, Pentaho, Airflow, dbt, Fivetran, Python scripts com boto3… a lista é grande.
Mas quando o destino é o Snowflake, a história muda de figura. É possível fazer toda a ingestão com apenas comandos SQL — sem pipelines externos, sem servidores, sem código complexo.
Parece bom demais para ser verdade? Não é. Vamos ver como.
Passo 1: Criar um External Stage
O primeiro passo é criar um External Stage, que nada mais é do que um “ponteiro” do Snowflake para o seu bucket S3 (ou outro storage).
Você pode fazer isso de duas formas:
-
Pela interface gráfica (Snowsight):
Worksheets → Create → Stage → External Stage → escolhe Amazon S3 → preenche URL e credenciais. -
Direto por SQL (mais rápido e versionável):
URL = 's3://seu-bucket-north/dados/'
CREDENTIALS = (AWS_KEY_ID = 'XXXX' AWS_SECRET_KEY = 'YYYY')
FILE_FORMAT = (TYPE = 'PARQUET');
Passo 2: Listar os arquivos no Stage
LIST @stage_north_s3;
Passo 3: Ler os dados diretamente do S3
Com uma única query você já consegue consultar os arquivos Parquet como se fossem tabelas:
metadata$filename AS nome_arquivo,
$1 AS raw_data, -- todo o registro Parquet
current_timestamp() AS loaded_at
FROM @stage_north_s3/products/
(FILE_FORMAT => 'PARQUET');
Incrível, né? Você está lendo Parquet direto do S3, sem mover nada.
Passo 4: Escolhendo a estratégia de ingestão para a camada Bronze
Agora que o stage está pronto, temos 3 formas nativas e extremamente eficientes de trazer os dados para uma tabela permanente no Snowflake — tudo só com SQL:
CREATE OR REPLACE TABLE … AS SELECT
Ideal para recriar a tabela do zero toda vez (ótimo em reprocessamentos completos).
SELECT
metadata$filename,
$1:* -- desestrutura todas as colunas do Parquet
FROM @stage_north_s3/products/
(FILE_FORMAT => 'PARQUET');
TRUNCATE + INSERT
Quando você quer sobrescrever os dados existentes.
INSERT INTO bronze.products
SELECT $1:* FROM @stage_north_s3/products/ (FILE_FORMAT => 'PARQUET');
COPY INTO (a mais poderosa e performática)
É o comando nativo de bulk load do Snowflake, com paralelismo automático e monitoramento integrado.
FROM @stage_north_s3/products/
FILE_FORMAT = (TYPE = 'PARQUET')
MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE
ON_ERROR = 'CONTINUE';
As três opções colocam os dados na sua camada Bronze usando apenas SQL, sem nenhuma ferramenta externa.
Conclusão
Antes de sair montando pipelines complexos com dezenas de tarefas, pergunte-se:
“Estou usando Snowflake? Os arquivos estão no S3/Azure/GCS?”
Se a resposta for sim para as duas perguntas, muitas vezes o melhor ETL é… nenhum ETL.
Um External Stage + COPY INTO resolvem 80% dos casos de ingestão de forma mais rápida, barata e confiável.