查詢資料夾和多個檔案
在本文中,您將瞭解如何在 Azure Synapse Analytics 中使用無伺服器 SQL 集區撰寫查詢。
無伺服器 SQL 集區支援使用通配符讀取多個檔案或資料夾,這類似於 Windows 中使用的通配符。 不過,因為允許多個萬用字元,所以會存在更大的彈性。
必要條件
您的第一個步驟是 建立資料庫 ,您可以在其中執行查詢。 然後,在該資料庫上執行 安裝腳本 來初始化物件。 此設定文本會建立這些範例中使用的數據源、資料庫範圍認證和外部檔格式。
使用資料夾 csv/taxi 遵循範例查詢。 它包含 NYC 計程車 - 黃色計程車車程記錄 數據從 2016 年 7 月到 2018 年 6 月。 csv/taxi 中的檔案會使用下列模式,以年和月命名:
yellow_tripdata_<year>-<month>.csv*
讀取資料夾中的所有檔案
下列範例會從 csv/taxi 資料夾讀取所有 NYC 黃色計程車 數據檔,然後傳回每年的乘客和車程總數。 也會顯示彙總函式的使用方式。
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/taxi/*.csv',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
pickup_datetime DATETIME2 2,
passenger_count INT 4
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
注意
使用單一 OPENROWSET
存取的所有檔案都必須具有相同的結構(數據行數目及其數據類型)。
讀取資料夾中的檔案子集
下列範例會使用通配符從 csv/taxi 資料夾讀取 2017 NYC 黃色計程車 數據檔,並傳回每個付款類型的總票價金額。
SELECT
payment_type,
SUM(fare_amount) AS fare_total
FROM OPENROWSET(
BULK 'csv/taxi/yellow_tripdata_2017-*.csv',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
payment_type INT 10,
fare_amount FLOAT 11
) AS nyc
GROUP BY payment_type
ORDER BY payment_type;
注意
使用單一 OPENROWSET
存取的所有檔案都必須具有相同的結構(數據行數目及其數據類型)。
使用多個檔案路徑讀取資料夾中的檔案子集
下列範例會使用兩個檔案路徑,從 csv/taxi 資料夾讀取 2017 NYC 黃色計程車 數據檔。 第一個使用包含 1 月數據之檔案的完整路徑,而第二個會使用通配符來讀取 10 月、11 月和 12 月的月份。 針對每個路徑,會傳回每個付款類型的總費用金額。
SELECT
payment_type,
SUM(fare_amount) AS fare_total
FROM OPENROWSET(
BULK (
'csv/taxi/yellow_tripdata_2017-01.csv',
'csv/taxi/yellow_tripdata_2017-1*.csv'
),
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
payment_type INT 10,
fare_amount FLOAT 11
) AS nyc
GROUP BY payment_type
ORDER BY payment_type;
注意
使用單一 OPENROWSET
存取的所有檔案都必須具有相同的結構(數據行數目及其數據類型)。
讀取資料夾
您提供給 OPENROWSET
的路徑也可以是資料夾的路徑。 下列各節包含這些查詢類型。
讀取特定資料夾中的所有檔案
您可以使用檔案層級通配符讀取資料夾中的所有檔案,如讀取資料夾中的所有檔案所示。 不過,有一種方法可以查詢資料夾,並取用該資料夾內的所有檔案。
如果 中 OPENROWSET
提供的路徑指向資料夾,該資料夾中的所有檔案都會作為查詢的來源。 下列查詢會讀取 csv/taxi 資料夾中的所有檔案。
注意
請注意查詢中路徑結尾是否存在 /
。 這代表資料夾。
/
如果省略 ,查詢會改為以名為 taxi 的檔案為目標。
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/taxi/',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_datetime DATETIME2,
dropoff_datetime DATETIME2,
passenger_count INT,
trip_distance FLOAT,
rate_code INT,
store_and_fwd_flag VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_location_id INT,
dropoff_location_id INT,
payment_type INT,
fare_amount FLOAT,
extra FLOAT,
mta_tax FLOAT,
tip_amount FLOAT,
tolls_amount FLOAT,
improvement_surcharge FLOAT,
total_amount FLOAT
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
注意
使用單一 OPENROWSET
存取的所有檔案都必須具有相同的結構(數據行數目及其數據類型)。
讀取多個資料夾中的所有檔案
您可以使用萬用字元來讀取多個資料夾中的檔案。 下列查詢會從 csv 資料夾中的所有資料夾讀取所有檔案,這些檔案的名稱開頭為 t,並以 i 結尾。
注意
請注意查詢中路徑結尾是否存在 /
。 這代表資料夾。
/
如果省略 ,查詢會改為以名為 t*i 的檔案為目標。
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/t*i/',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_datetime DATETIME2,
dropoff_datetime DATETIME2,
passenger_count INT,
trip_distance FLOAT,
rate_code INT,
store_and_fwd_flag VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_location_id INT,
dropoff_location_id INT,
payment_type INT,
fare_amount FLOAT,
extra FLOAT,
mta_tax FLOAT,
tip_amount FLOAT,
tolls_amount FLOAT,
improvement_surcharge FLOAT,
total_amount FLOAT
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
注意
使用單一 OPENROWSET
存取的所有檔案都必須具有相同的結構(數據行數目及其數據類型)。
由於您只有一個符合準則的資料夾,因此查詢結果與讀取資料夾中的所有檔案相同。
以遞迴方式周遊遍歷資料夾
如果您在路徑結尾指定 /**
,無伺服器 SQL 集區可以遞歸地周遊資料夾。 下列查詢會從 csv/taxi 資料夾中的所有資料夾和子資料夾讀取所有檔案。
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/taxi/**',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_datetime DATETIME2,
dropoff_datetime DATETIME2,
passenger_count INT,
trip_distance FLOAT,
rate_code INT,
store_and_fwd_flag VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_location_id INT,
dropoff_location_id INT,
payment_type INT,
fare_amount FLOAT,
extra FLOAT,
mta_tax FLOAT,
tip_amount FLOAT,
tolls_amount FLOAT,
improvement_surcharge FLOAT,
total_amount FLOAT
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
注意
使用單一 OPENROWSET
存取的所有檔案都必須具有相同的結構(數據行數目及其數據類型)。
使用多個萬用字元
您可以在不同的路徑層級上使用多個萬用字元。 例如,您可以從名稱開頭為 t 且以 i 結尾的所有資料夾中,擴充先前的查詢來讀取具有 2017 資料的檔案。
注意
請注意查詢中路徑結尾是否存在 /
。 這代表資料夾。
/
如果省略 ,查詢會改為以名為 t*i 的檔案為目標。
每個査詢最多只能使用 10 個萬用字元。
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/t*i/yellow_tripdata_2017-*.csv',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_datetime DATETIME2,
dropoff_datetime DATETIME2,
passenger_count INT,
trip_distance FLOAT,
rate_code INT,
store_and_fwd_flag VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_location_id INT,
dropoff_location_id INT,
payment_type INT,
fare_amount FLOAT,
extra FLOAT,
mta_tax FLOAT,
tip_amount FLOAT,
tolls_amount FLOAT,
improvement_surcharge FLOAT,
total_amount FLOAT
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
注意
使用單一 OPENROWSET
存取的所有檔案都必須具有相同的結構(數據行數目及其數據類型)。
由於您只有一個資料夾符合準則,所以查詢結果與讀取資料夾中的一部分檔案與讀取特定資料夾中的所有檔案相同。 如需更複雜的通配符使用案例,請參閱 查詢 Parquet 檔案。