Executando verificação de segurança...
5

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:

  1. Pela interface gráfica (Snowsight):
    Worksheets → Create → Stage → External Stage → escolhe Amazon S3 → preenche URL e credenciais.

  2. 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.

Carregando publicação patrocinada...
1

Parabéns pelo artigo. Um tempo atrás conteúdos como o seu (snowflake) me ajudou muito entender as soluções e a que melhor adequava ao meu problema.

Eu uso DuckDB para ETL com Apache Airflow lendo PostgreSQL, parquet no GCS, e exportando para BigQuery e Google Planilhas. Por último usam os dados no Looker Studio. Essa estrutura tem funcionado bem. Mas já considerei usar ClickHouse como substituto ao BigQuery para baratear os relatórios no Looker Studio com muitos acessos.

0