Ingerir dados com métodos SQL

Concluído(a)

Os comandos SQL fornecem uma abordagem declarativa para a ingestão de dados no Azure Databricks. Se você já estiver familiarizado com a sintaxe do SQL, esses métodos permitem que você crie e preencha tabelas sem escrever código de procedimento. As três técnicas primárias de ingestão de SQL —CREATE TABLE AS SELECT (CTAS)CREATE OR REPLACE TABLE e COPY INTO— cada uma aborda diferentes cenários de ingestão, mantendo a compatibilidade total com o Catálogo do Unity.

Criar tabelas a partir de consultas com CTAS

A CREATE TABLE AS SELECT instrução combina a criação da tabela e a população de dados em uma única operação. Você define uma nova tabela com base nos resultados de uma consulta SELECT, tornando-a ideal para transformar dados durante a ingestão.

Considere um cenário em que você precisa ingerir dados do cliente de uma fonte externa e aplicar transformações. Com o CTAS, você escreve uma consulta que lê da origem, aplica suas transformações e salva os resultados em uma nova tabela gerenciada:

CREATE TABLE catalog.schema.customers AS
SELECT 
    customer_id,
    UPPER(customer_name) AS customer_name,
    email,
    created_date
FROM external_staging.raw_customers
WHERE customer_status = 'active';

O esquema de tabela é derivado automaticamente dos resultados da consulta. O Azure Databricks cria a tabela usando o formato Delta por padrão, que fornece transações ACID, viagens no tempo e desempenho otimizado.

O CTAS funciona bem para cargas de dados iniciais e migrações pontuais. Quando você precisar ler dados de arquivos, combine CTAS com a read_files função com valor de tabela:

CREATE TABLE catalog.schema.sales_data AS
SELECT * FROM read_files(
    '/Volumes/catalog/schema/volume/sales/*.parquet',
    format => 'parquet'
);

Observação

O CTAS cria uma nova tabela a cada execução. Se a tabela já existir, o comando falhará a menos que você use a IF NOT EXISTS cláusula, mas essa cláusula ignorará totalmente a execução em vez de atualizar a tabela.

Atualizar tabelas com CREATE OR REPLACE TABLE

Quando você precisa atualizar totalmente o conteúdo de uma tabela, CREATE OR REPLACE TABLE fornece uma solução limpa. Esse comando cria uma nova tabela ou substitui completamente uma existente, preservando o histórico da tabela, privilégios concedidos e quaisquer filtros de linha ou máscaras de coluna que você configurou.

Essa abordagem se mostra valiosa para atualizações de dados periódicas em que você deseja substituir todos os dados existentes:

CREATE OR REPLACE TABLE catalog.schema.daily_metrics AS
SELECT 
    report_date,
    SUM(revenue) AS total_revenue,
    COUNT(DISTINCT customer_id) AS unique_customers
FROM catalog.schema.transactions
WHERE report_date >= CURRENT_DATE - INTERVAL 30 DAYS
GROUP BY report_date;

Ao contrário de descartar e recriar uma tabela, CREATE OR REPLACE mantém os metadados e as permissões da tabela. Os usuários e aplicativos downstream continuam acessando a tabela sem reconfiguração.

Você também pode usar esse comando para carregar dados diretamente de arquivos. O esquema é inferido automaticamente dos resultados da consulta:

CREATE OR REPLACE TABLE catalog.schema.products AS
SELECT * FROM read_files(
    '/Volumes/catalog/schema/volume/products.csv',
    format => 'csv',
    header => true
);

Importante

CREATE OR REPLACE executa uma substituição de tabela completa. Para atualizações incrementais em que você só deseja adicionar novos registros, use COPY INTO em vez disso.

Carregar arquivos incrementalmente com COPY INTO

COPY INTO aborda um desafio de ingestão comum: carregar arquivos do armazenamento em nuvem de maneira confiável e repetível. Ao contrário do CTAS, que é executado uma vez e cria uma tabela, COPY INTO é projetado para fluxos de trabalho de ingestão contínuos em que novos arquivos chegam regularmente.

O comando lê arquivos de um local especificado e os acrescenta a uma tabela Delta existente. Seu principal recurso é a idempotência — os arquivos que já foram carregados são ignorados automaticamente, mesmo em várias execuções.

COPY INTO catalog.schema.events
FROM '/Volumes/catalog/schema/volume/events/'
FILEFORMAT = JSON
FORMAT_OPTIONS ('multiline' = 'true');

Antes de executar COPY INTO, a tabela de destino já deve existir. Crie-o com o esquema apropriado:

CREATE TABLE IF NOT EXISTS catalog.schema.events (
    event_id STRING,
    event_type STRING,
    event_timestamp TIMESTAMP,
    payload STRING
);

Configurar a seleção de arquivo

Quando o diretório de origem contiver arquivos com padrões de nomenclatura diferentes ou você precisar carregar arquivos específicos, use as opções PATTERN ou FILES.

-- Load only files matching a pattern
COPY INTO catalog.schema.orders
FROM '/Volumes/catalog/schema/volume/orders/'
FILEFORMAT = PARQUET
PATTERN = 'orders_2024*.parquet';

-- Load specific files by name
COPY INTO catalog.schema.orders
FROM '/Volumes/catalog/schema/volume/orders/'
FILEFORMAT = PARQUET
FILES = ('orders_001.parquet', 'orders_002.parquet');

Gerenciar o esquema e a qualidade dos dados

COPY INTO fornece opções para lidar com alterações de esquema e validar dados antes de carregar:

COPY INTO catalog.schema.sensor_data
FROM '/Volumes/catalog/schema/volume/sensors/'
FILEFORMAT = CSV
FORMAT_OPTIONS (
    'header' = 'true',
    'inferSchema' = 'true'
)
COPY_OPTIONS ('mergeSchema' = 'true');

A mergeSchema opção permite que o esquema de tabela evolua conforme novas colunas aparecem nos arquivos de origem. Para validar dados sem carregá-los, adicione a cláusula VALIDATE:

COPY INTO catalog.schema.sensor_data
FROM '/Volumes/catalog/schema/volume/sensors/'
FILEFORMAT = CSV
VALIDATE ALL;

Essa validação verifica se os dados podem ser analisados, corresponde ao esquema da tabela e atende às restrições de nulidade e verificação.

Escolher o método certo

Cada método de ingestão de SQL serve a propósitos distintos em seus fluxos de trabalho de engenharia de dados:

Método Mais adequado para Comportamento
CTAS Cargas de dados iniciais, migrações pontuais, criando tabelas a partir de consultas Cria uma nova tabela; falhará se a tabela existir
CRIAR OU SUBSTITUIR Atualizações completas periódicas, substituindo tabelas de estágio Substitui a tabela inteira; preserva permissões
COPIAR PARA Ingestão contínua de arquivos, cargas incrementais Acrescenta à tabela existente; ignora arquivos carregados

Para ingestão baseada em arquivos que requer inferência automática de esquema, notificações de arquivos ou garantias de "exatamente uma vez", considere usar o Auto Loader como uma abordagem complementar. Quando suas necessidades de ingestão são simples e você prefere SQL declarativo em vez de código processual, esses três métodos fornecem um kit de ferramentas completo para gerenciar o fluxo de dados no Catálogo do Unity.

Observação

COPY INTO funciona bem ao processar arquivos na ordem de milhares ao longo do tempo. Para fontes que aumentarão para milhões de arquivos ou mais, o Carregador Automático (coberto na próxima unidade) é a abordagem recomendada: descobre arquivos com mais eficiência, dá suporte à evolução de esquema mais avançada e escala sem a sobrecarga da listagem de diretórios. O Databricks também recomenda as tabelas de streaming apoiadas pelo Carregador Automático como uma alternativa escalonável e de longo prazo para ingestão de arquivo baseada em SQL.