Como consultar ficheiros Parquet no Synapse com OPENROWSET
O serverless SQL pool do Azure Synapse Analytics permite consultar ficheiros Parquet guardados no Data Lake diretamente com T-SQL, sem copiar os dados nem provisionar servidores. A função OPENROWSET abre esses ficheiros como se fossem uma tabela, e paga apenas os dados que a consulta processa.
Pré-requisitos
- Um workspace do Azure Synapse Analytics (o serverless SQL pool Built-in já vem incluído).
- Ficheiros Parquet numa conta de armazenamento ADLS Gen2 ou Blob Storage.
- Permissão de leitura no armazenamento (identidade Microsoft Entra, SAS ou Managed Identity).
- Um cliente SQL: o Synapse Studio, o Azure Data Studio ou o SSMS ligado ao endpoint serverless.
Passo 1: Consultar um ficheiro Parquet
Comece por ler um único ficheiro. No BULK indica-se o caminho completo e em FORMAT o tipo Parquet. O alias a seguir aos parênteses é obrigatório.
SELECT TOP 100 *
FROM OPENROWSET(
BULK 'https://minhastorage.dfs.core.windows.net/datalake/vendas/vendas.parquet',
FORMAT = 'PARQUET'
) AS dados;
Não é preciso declarar colunas: o serverless SQL pool lê os nomes e os tipos de dados a partir dos metadados do próprio ficheiro Parquet.
Passo 2: Ler uma pasta inteira com wildcards
Para tratar muitos ficheiros como uma só tabela, aponte para a pasta e use o wildcard *. Coloque ** no fim do caminho para percorrer também as subpastas.
SELECT TOP 100 *
FROM OPENROWSET(
BULK 'https://minhastorage.dfs.core.windows.net/datalake/vendas/*.parquet',
FORMAT = 'PARQUET'
) AS dados;
Ao ler vários ficheiros, o schema é inferido a partir do primeiro ficheiro que o serviço encontra. Ficheiros cujo nome começa por _ ou . são ignorados.
Dica: comece sempre com SELECT TOP 100 para inspecionar os dados antes de correr consultas sobre pastas grandes — assim controla o volume processado e o custo.
Passo 3: Definir o schema com a cláusula WITH
Para escolher só algumas colunas e garantir os tipos certos, acrescente a cláusula WITH. Em Parquet, as colunas são associadas pelo nome (sensível a maiúsculas), por isso os nomes têm de coincidir com os do ficheiro.
SELECT TOP 100 *
FROM OPENROWSET(
BULK 'https://minhastorage.dfs.core.windows.net/datalake/vendas/*.parquet',
FORMAT = 'PARQUET'
)
WITH (
data_venda date,
produto varchar(100) COLLATE Latin1_General_100_BIN2_UTF8,
quantidade int,
total decimal(10,2)
) AS dados;
A collation Latin1_General_100_BIN2_UTF8 nas colunas de texto dá um ganho de desempenho ao filtrar dados em Parquet.
Passo 4: Filtrar partições com filepath()
Se os dados estiverem organizados em pastas por ano e mês (por exemplo ano=2025/mes=07), a função filepath(n) devolve a parte do caminho que corresponde ao enésimo wildcard. Usá-la no WHERE faz com que só os ficheiros necessários sejam lidos — menos dados processados, menos custo.
SELECT
dados.filepath(1) AS ano,
dados.filepath(2) AS mes,
COUNT_BIG(*) AS linhas
FROM OPENROWSET(
BULK 'https://minhastorage.dfs.core.windows.net/datalake/vendas/ano=*/mes=*/*.parquet',
FORMAT = 'PARQUET'
) AS dados
WHERE dados.filepath(1) = '2025' AND dados.filepath(2) = '07'
GROUP BY dados.filepath(1), dados.filepath(2);
A função filename() complementa esta abordagem, devolvendo o nome do ficheiro de origem de cada linha.
Passo 5: Simplificar o caminho com uma EXTERNAL DATA SOURCE
Repetir o URL completo em cada consulta é aborrecido. Pode criar uma fonte de dados externa que aponta para a raiz do container e depois usar caminhos relativos.
CREATE EXTERNAL DATA SOURCE datalake
WITH ( LOCATION = 'https://minhastorage.dfs.core.windows.net/datalake' );
GO
SELECT TOP 100 *
FROM OPENROWSET(
BULK 'vendas/*.parquet',
DATA_SOURCE = 'datalake',
FORMAT = 'PARQUET'
) AS dados;
Agora o BULK contém apenas o caminho relativo e o DATA_SOURCE trata do resto.
Verificar o resultado
Execute a consulta do Passo 1: deve ver as primeiras 100 linhas com os nomes de coluna corretos. Para confirmar que a filtragem por partição funcionou, acrescente dados.filename() ao SELECT e verifique que só aparecem ficheiros das pastas esperadas. No separador de monitorização do Synapse, um valor baixo de data processed confirma que o pruning reduziu a leitura.
Conclusão
Com o OPENROWSET passou a consultar Parquet no Data Lake sem mover um único byte para uma base de dados. O próximo passo natural é encapsular a consulta numa VIEW ou criar uma EXTERNAL DATA SOURCE para não repetir o URL completo em cada query. Uma dica final: mantenha a collation Latin1_General_100_BIN2_UTF8 nas colunas de texto. Que pasta do seu Data Lake vai explorar primeiro?