使用無伺服器 SQL 集區查詢中的檔案中繼資料
在本文中,您將瞭解如何使用元數據查詢特定檔案或資料夾。 無伺服器 SQL 集區可以處理多個檔案和資料夾。 如需詳細資訊,請參閱 查詢資料夾和多個檔案。
有時候,您可能需要知道哪個檔案或資料夾來源與結果集中的特定數據列相互關聯。 您可以使用 函式 filepath
來 filename
傳回結果集中的檔名和/或路徑,也可以使用它們根據檔名或資料夾路徑來篩選數據。 檔名函式和 filepath 函式會說明這些函式。
下列各節提供簡短描述和程式碼範例。
必要條件
您的第一個步驟是 使用參考記憶體帳戶的數據源來建立資料庫 。 然後,在該資料庫上執行 安裝腳本 來初始化物件。 此設定文本會建立這些範例中使用的數據源、資料庫範圍認證和外部檔格式。
函式
檔案名稱
函 filename
式會傳回數據列的來源檔名。
下列範例會讀取 2017 年 9 月的 NYC 黃色計程車數據檔,並傳回每個檔案的車程數目。 查詢 OPENROWSET
的一部分會指定要讀取的檔案。
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();
下列範例會示範如何在 WHERE
子句中使用 filename()
來篩選要讀取的檔案。 它會存取查詢中 OPENROWSET
部分的整個資料夾,並篩選 WHERE
子句中的檔案。
您的結果會與先前的範例相同。
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];
Filepath
函 filepath
式會傳回完整或部分路徑:
- 在沒有參數的情況下呼叫時,它會傳回數據列的來源完整檔案路徑。 在 中使用
OPENROWSET
時DATA_SOURCE
,它會傳回相對於DATA_SOURCE
的路徑。 - 若以參數進行呼叫,則會傳回路徑的一部分,該部分會與參數中所指定位置上的萬用字元相符。 例如,參數值 1 會傳回符合第一個通配符之路徑的一部分。
下列範例會 讀取 2017 年過去三個月的 NYC 黃色計程車 數據檔。 並傳回每個檔案路徑的乘車次數。 查詢 OPENROWSET
的一部分會指定要讀取的檔案。
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;
下列範例會示範如何在 WHERE
子句中使用 filepath()
來篩選要讀取的檔案。
您可以在查詢的 OPENROWSET
部分中使用萬用字元,並在 WHERE
子句中篩選檔案。 您的結果會與先前的範例相同。
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;