Como criar External Tables com CETAS no Azure Synapse
O comando CETAS (CREATE EXTERNAL TABLE AS SELECT) no Azure Synapse lê dados em bruto do Data Lake, transforma-os com SQL e grava o resultado já otimizado em Parquet, criando ao mesmo tempo uma External Table pronta a consultar. É a forma mais simples de construir uma camada "curated" no SQL serverless, sem copiar dados para fora do lake nem pagar por infraestrutura dedicada. O exemplo seguinte parte de ficheiros CSV de vendas e produz uma tabela agregada por país.
Pré-requisitos
- Um workspace de Azure Synapse Analytics com o pool SQL serverless (Built-in).
- Uma conta ADLS Gen2 com ficheiros CSV numa pasta (por exemplo
raw/vendas/). - A permissão Storage Blob Data Contributor na conta de armazenamento — o CETAS precisa de escrever ficheiros no lake.
- O Synapse Studio aberto, com um novo script SQL ligado ao pool Built-in.
Passo 1: Criar a base de dados e a master key
Como uma External Table é um objeto de base de dados, começa por criar uma base de dados própria (não uses a master). A master key é necessária para proteger a credencial que vais criar a seguir.
CREATE DATABASE VendasDW;
GO
USE VendasDW;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Uma-Password-Forte-2026!';
Passo 2: Ligar ao Data Lake
Vais indicar ao Synapse onde estão os dados e como se autenticar. A forma mais segura é usar a Managed Identity do workspace, evitando guardar chaves. Substitui aconta pelo nome real da tua conta de armazenamento.
CREATE DATABASE SCOPED CREDENTIAL cred_managed_id
WITH IDENTITY = 'Managed Identity';
GO
CREATE EXTERNAL DATA SOURCE lake_dados
WITH (
LOCATION = 'https://aconta.dfs.core.windows.net/dados',
CREDENTIAL = cred_managed_id
);
Confirma que a identidade gerida do workspace tem o papel Storage Blob Data Contributor no container dados, caso contrário o passo seguinte falha com um erro de permissões.
Passo 3: Definir o formato de saída
O CETAS grava os resultados em ficheiros. Aqui escolhes Parquet com compressão Snappy — a melhor opção para consultas rápidas e económicas, porque é um formato colunar e comprimido.
CREATE EXTERNAL FILE FORMAT parquet_snappy
WITH (
FORMAT_TYPE = PARQUET,
DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
Passo 4: Executar o CETAS
Agora juntas tudo. A cláusula SELECT lê os CSV em bruto com OPENROWSET e agrega as vendas por país; o resultado é escrito em Parquet na pasta curated/vendas_por_pais/ e exposto como a External Table dbo.VendasPorPais.
CREATE EXTERNAL TABLE dbo.VendasPorPais
WITH (
LOCATION = 'curated/vendas_por_pais/',
DATA_SOURCE = lake_dados,
FILE_FORMAT = parquet_snappy
)
AS
SELECT
pais,
COUNT(*) AS num_vendas,
SUM(valor) AS total_valor
FROM OPENROWSET(
BULK 'raw/vendas/*.csv',
DATA_SOURCE = 'lake_dados',
FORMAT = 'CSV',
PARSER_VERSION = '2.0',
HEADER_ROW = TRUE
) AS origem
GROUP BY pais;
Repara que a pasta de destino em LOCATION tem de estar vazia. Se já existir, o CETAS devolve um erro — é uma proteção para não sobrescrever dados por engano.
Dica: dá sempre um nome descritivo à pasta de destino (por exemplo, o nome da tabela). Assim é fácil localizar e limpar os ficheiros quando precisares de refrescar os dados.
Verificar o resultado
Consulta a nova tabela como se fosse uma tabela normal:
SELECT TOP 10 *
FROM dbo.VendasPorPais
ORDER BY total_valor DESC;
Depois, no separador Data do Synapse Studio, abre o container e confirma que a pasta curated/vendas_por_pais/ contém um ou mais ficheiros .parquet. Se vês linhas na consulta e ficheiros na pasta, o CETAS correu com sucesso.
Conclusão
Com poucas linhas de SQL criaste uma camada curated em Parquet e uma External Table pronta para o Power BI, tudo sem sair do Data Lake. Um ponto importante: o CETAS não atualiza dados existentes. Para refrescar, apaga a External Table com DROP EXTERNAL TABLE, remove os ficheiros da pasta e volta a executar — ou grava cada carga numa pasta com data. Qual vai ser a primeira tabela do teu lake que faz sentido materializar assim?