Wykonywanie zapytań względem folderów i wielu plików
W tym artykule dowiesz się, jak napisać zapytanie przy użyciu bezserwerowej puli SQL w usłudze Azure Synapse Analytics.
Bezserwerowa pula SQL obsługuje odczytywanie wielu plików/folderów przy użyciu symboli wieloznacznych, które są podobne do symboli wieloznacznych używanych w systemie operacyjnym Windows. Jednak większa elastyczność jest obecna, ponieważ dozwolone jest wiele symboli wieloznacznych.
Wymagania wstępne
Pierwszym krokiem jest utworzenie bazy danych , w której będą wykonywane zapytania. Następnie zainicjuj obiekty, wykonując skrypt instalacji w tej bazie danych. Ten skrypt instalacyjny utworzy źródła danych, poświadczenia o zakresie bazy danych i zewnętrzne formaty plików, które są używane w tych przykładach.
Użyjesz folderu csv/taxi , aby postępować zgodnie z przykładowymi zapytaniami. Zawiera dane NYC Taxi - Yellow Taxi Trip Records od lipca 2016 r. do czerwca 2018 r. Pliki w pliku csv/taxi są nazwane po roku i miesiącu przy użyciu następującego wzorca: yellow_tripdata_< rok-miesiąc<>>.csv
Odczytywanie wszystkich plików w folderze
Poniższy przykład odczytuje wszystkie pliki danych żółtych taksówek NYC z folderu csv/taxi i zwraca całkowitą liczbę pasażerów i przejazdów rocznie. Pokazuje również użycie funkcji agregujących.
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);
Uwaga
Wszystkie pliki dostępne za pomocą pojedynczego zestawu OPENROWSET muszą mieć taką samą strukturę (tj. liczbę kolumn i ich typy danych).
Odczytywanie podzestawu plików w folderze
Poniższy przykład odczytuje pliki danych żółtych taksówek 2017 NYC z folderu csv/taxi przy użyciu symbolu wieloznacznych i zwraca łączną kwotę taryfy za typ płatności.
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;
Uwaga
Wszystkie pliki dostępne za pomocą pojedynczego zestawu OPENROWSET muszą mieć taką samą strukturę (tj. liczbę kolumn i ich typy danych).
Odczytywanie podzestawu plików w folderze przy użyciu wielu ścieżek plików
Poniższy przykład odczytuje pliki danych żółtych taksówek 2017 NYC z folderu csv/taxi przy użyciu 2 ścieżek plików pierwszy z pełną ścieżką do pliku zawierającego dane z miesiąca stycznia i drugiego z symbolem wieloznaczny odczyt miesięcy listopada i grudnia, który zwraca łączną kwotę taryfy za typ płatności.
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;
Uwaga
Wszystkie pliki dostępne za pomocą pojedynczego zestawu OPENROWSET muszą mieć taką samą strukturę (tj. liczbę kolumn i ich typy danych).
Odczytywanie folderów
Ścieżka, którą podajesz w pliku OPENROWSET, może być również ścieżką do folderu. Poniższe sekcje zawierają te typy zapytań.
Odczytywanie wszystkich plików z określonego folderu
Wszystkie pliki w folderze można odczytać przy użyciu symbolu wieloznacznych na poziomie pliku, jak pokazano w sekcji Odczytaj wszystkie pliki w folderze. Jednak istnieje sposób wykonywania zapytań o folder i korzystania ze wszystkich plików w tym folderze.
Jeśli ścieżka podana w pliku OPENROWSET wskazuje folder, wszystkie pliki w tym folderze będą używane jako źródło zapytania. Następujące zapytanie odczytuje wszystkie pliki w folderze csv/taxi .
Uwaga
Zanotuj istnienie / na końcu ścieżki w poniższym zapytaniu. Określa folder. Jeśli parametr / zostanie pominięty, zapytanie będzie dotyczyć pliku o nazwie taxi zamiast.
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);
Uwaga
Wszystkie pliki dostępne za pomocą pojedynczego zestawu OPENROWSET muszą mieć taką samą strukturę (tj. liczbę kolumn i ich typy danych).
Odczytywanie wszystkich plików z wielu folderów
Można odczytywać pliki z wielu folderów przy użyciu symbolu wieloznacznych. Poniższe zapytanie odczytuje wszystkie pliki ze wszystkich folderów znajdujących się w folderze csv , które mają nazwy rozpoczynające się od t i kończące się na i.
Uwaga
Zanotuj istnienie / na końcu ścieżki w poniższym zapytaniu. Określa folder. Jeśli parametr / zostanie pominięty, zapytanie będzie dotyczyć plików o nazwie t*i zamiast tego.
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);
Uwaga
Wszystkie pliki dostępne za pomocą pojedynczego zestawu OPENROWSET muszą mieć taką samą strukturę (tj. liczbę kolumn i ich typy danych).
Ponieważ masz tylko jeden folder, który spełnia kryteria, wynik zapytania jest taki sam jak odczyt wszystkich plików w folderze.
Przechodzenie folderów rekursywnie
Bezserwerowa pula SQL może cyklicznie przechodzić przez foldery, jeśli określisz /** na końcu ścieżki. Następujące zapytanie odczytuje wszystkie pliki ze wszystkich folderów i podfolderów znajdujących się w folderze 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);
Uwaga
Wszystkie pliki dostępne za pomocą pojedynczego zestawu OPENROWSET muszą mieć taką samą strukturę (tj. liczbę kolumn i ich typy danych).
Wiele symboli wieloznacznych
Można użyć wielu symboli wieloznacznych na różnych poziomach ścieżki. Można na przykład wzbogacić poprzednie zapytanie, aby odczytywać pliki tylko z danymi z 2017 r., ze wszystkich folderów, które nazwy zaczynają się od t i kończą się na i.
Uwaga
Zanotuj istnienie / na końcu ścieżki w poniższym zapytaniu. Określa folder. Jeśli parametr / zostanie pominięty, zapytanie będzie dotyczyć plików o nazwie t*i zamiast tego. Istnieje maksymalny limit 10 symboli wieloznacznych na zapytanie.
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);
Uwaga
Wszystkie pliki dostępne za pomocą pojedynczego zestawu OPENROWSET muszą mieć taką samą strukturę (tj. liczbę kolumn i ich typy danych).
Ponieważ masz tylko jeden folder, który spełnia kryteria, wynik zapytania jest taki sam jak odczyt podzestawu plików w folderze i Odczyt wszystkich plików z określonego folderu. Bardziej złożone scenariusze użycia symboli wieloznacznych są omówione w plikach Query Parquet.
Następne kroki
Więcej informacji można znaleźć w artykule Query specific files (Zapytania dotyczące plików ).