(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo crear External Tables con CETAS en Azure Synapse

João Barros 05 de July de 2026 4 min de lectura

El comando CETAS (CREATE EXTERNAL TABLE AS SELECT) en Azure Synapse lee datos en bruto del Data Lake, los transforma con SQL y escribe el resultado ya optimizado en Parquet, creando al mismo tiempo una External Table lista para consultar. Es la forma más sencilla de construir una capa "curated" en SQL serverless, sin copiar datos fuera del lake ni pagar por infraestructura dedicada. El ejemplo siguiente parte de archivos CSV de ventas y produce una tabla agregada por país.

Requisitos previos

  • Un workspace de Azure Synapse Analytics con el pool SQL serverless (Built-in).
  • Una cuenta ADLS Gen2 con archivos CSV en una carpeta (por ejemplo raw/vendas/).
  • El rol Storage Blob Data Contributor en la cuenta de almacenamiento: CETAS necesita escribir archivos en el lake.
  • Synapse Studio abierto, con un nuevo script SQL conectado al pool Built-in.

Paso 1: Crear la base de datos y la master key

Como una External Table es un objeto de base de datos, empieza por crear una base de datos propia (no uses master). La master key es necesaria para proteger la credencial que crearás a continuación.

CREATE DATABASE VendasDW;
GO
USE VendasDW;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Uma-Password-Forte-2026!';

Paso 2: Conectar al Data Lake

Indica a Synapse dónde están los datos y cómo autenticarse. La opción más segura es usar la Managed Identity del workspace, evitando guardar claves. Sustituye aconta por el nombre real de tu cuenta de almacenamiento.

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
);

Comprueba que la identidad administrada del workspace tiene el rol Storage Blob Data Contributor en el contenedor dados; de lo contrario, el paso siguiente falla con un error de permisos.

Paso 3: Definir el formato de salida

CETAS escribe sus resultados en archivos. Aquí eliges Parquet con compresión Snappy: la mejor opción para consultas rápidas y económicas, porque es un formato columnar y comprimido.

CREATE EXTERNAL FILE FORMAT parquet_snappy
WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);

Paso 4: Ejecutar CETAS

Ahora lo juntas todo. La cláusula SELECT lee los CSV en bruto con OPENROWSET y agrega las ventas por país; el resultado se escribe en Parquet en la carpeta curated/vendas_por_pais/ y se expone como la 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;

Ten en cuenta que la carpeta de destino en LOCATION debe estar vacía. Si ya existe, CETAS devuelve un error: es una protección para no sobrescribir datos por error.

Consejo: da siempre un nombre descriptivo a la carpeta de destino (por ejemplo, el nombre de la tabla). Así es fácil localizar y limpiar los archivos cuando necesites refrescar los datos.

Verificar el resultado

Consulta la nueva tabla como si fuera una tabla normal:

SELECT TOP 10 *
FROM dbo.VendasPorPais
ORDER BY total_valor DESC;

Después, en la pestaña Data de Synapse Studio, abre el contenedor y confirma que la carpeta curated/vendas_por_pais/ contiene uno o más archivos .parquet. Si ves filas en la consulta y archivos en la carpeta, CETAS se ejecutó correctamente.

Conclusión

Con unas pocas líneas de SQL creaste una capa curated en Parquet y una External Table lista para Power BI, todo sin salir del Data Lake. Un punto importante: CETAS no actualiza datos existentes. Para refrescar, elimina la External Table con DROP EXTERNAL TABLE, borra los archivos de la carpeta y vuelve a ejecutarlo, o escribe cada carga en una carpeta con fecha. ¿Cuál será la primera tabla de tu lake que tenga sentido materializar así?