Utilizar metadados de ficheiros em consultas do conjunto de SQL sem servidor
O conjunto de SQL sem servidor pode abordar vários ficheiros e pastas, conforme descrito no artigo Pastas de consulta e vários ficheiros . Neste artigo, irá aprender a utilizar informações de metadados sobre nomes de ficheiros e pastas nas consultas.
Por vezes, poderá ter de saber que ficheiro ou origem de pasta está correlacionada com uma linha específica no conjunto de resultados.
Pode utilizar a função filepath
e filename
devolver nomes de ficheiros e/ou o caminho no conjunto de resultados. Em alternativa, pode utilizá-los para filtrar dados com base no nome do ficheiro e/ou no caminho da pasta. Estas funções estão descritas na função filename da secção de sintaxe e na função filepath. Nas secções seguintes, encontrará breves descrições ao longo de exemplos.
Pré-requisitos
O primeiro passo é criar uma base de dados com uma origem de dados que faça referência à conta de armazenamento. Em seguida, inicialize os objetos ao executar o script de configuração nessa base de dados. Este script de configuração irá criar as origens de dados, as credenciais no âmbito da base de dados e os formatos de ficheiro externos utilizados nestes exemplos.
Funções
Nome do ficheiro
Esta função devolve o nome de ficheiro do qual a linha tem origem.
O exemplo seguinte lê os ficheiros de dados do Táxi Amarelo de NYC nos últimos três meses de 2017 e devolve o número de viagens por ficheiro. A parte OPENROWSET da consulta especifica os ficheiros que serão lidos.
SELECT
nyc.filename() AS [filename]
,COUNT_BIG(*) AS [rows]
FROM
OPENROWSET(
BULK 'parquet/taxi/year=2017/month=9/*.parquet',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT='PARQUET'
) nyc
GROUP BY nyc.filename();
O exemplo seguinte mostra como o nome de ficheiro() pode ser utilizado na cláusula WHERE para filtrar os ficheiros a ler. Acede a toda a pasta na parte OPENROWSET da consulta e filtra ficheiros na cláusula WHERE.
Os seus resultados serão os mesmos que o exemplo anterior.
SELECT
r.filename() AS [filename]
,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
BULK 'csv/taxi/yellow_tripdata_2017-*.csv',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT = 'CSV',
PARSER_VERSION = '2.0',
FIRSTROW = 2)
WITH (C1 varchar(200) ) AS [r]
WHERE
r.filename() IN ('yellow_tripdata_2017-10.csv', 'yellow_tripdata_2017-11.csv', 'yellow_tripdata_2017-12.csv')
GROUP BY
r.filename()
ORDER BY
[filename];
Caminho de Ficheiro
A função filepath devolve um caminho completo ou parcial:
- Quando chamado sem um parâmetro, devolve o caminho de ficheiro completo do qual a linha tem origem. Quando DATA_SOURCE é utilizada em OPENROWSET, devolve o caminho relativamente a DATA_SOURCE.
- Quando chamado com um parâmetro, devolve parte do caminho que corresponde ao caráter universal na posição especificada no parâmetro. Por exemplo, o valor do parâmetro 1 devolveria parte do caminho que corresponde ao primeiro caráter universal.
O exemplo seguinte lê os ficheiros de dados do Táxi Amarelo de NYC nos últimos três meses de 2017. Devolve o número de passeios por caminho de ficheiro. A parte OPENROWSET da consulta especifica os ficheiros que serão lidos.
SELECT
r.filepath() AS filepath
,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
BULK 'csv/taxi/yellow_tripdata_2017-1*.csv',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT = 'CSV',
PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id INT
) AS [r]
GROUP BY
r.filepath()
ORDER BY
filepath;
O exemplo seguinte mostra como o filepath() pode ser utilizado na cláusula WHERE para filtrar os ficheiros a ler.
Pode utilizar os carateres universais na parte OPENROWSET da consulta e filtrar os ficheiros na cláusula WHERE. Os seus resultados serão os mesmos que o exemplo anterior.
SELECT
r.filepath() AS filepath
,r.filepath(1) AS [year]
,r.filepath(2) AS [month]
,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
BULK 'csv/taxi/yellow_tripdata_*-*.csv',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT = 'CSV',
PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id INT
) AS [r]
WHERE
r.filepath(1) IN ('2017')
AND r.filepath(2) IN ('10', '11', '12')
GROUP BY
r.filepath()
,r.filepath(1)
,r.filepath(2)
ORDER BY
filepath;
Passos seguintes
No próximo artigo, irá aprender a consultar ficheiros Parquet.