Condividi tramite


Eseguire query su cartelle e più file

Questo articolo illustra come scrivere una query usando un pool SQL serverless in Azure Synapse Analytics.

Il pool SQL serverless supporta la lettura di più file o cartelle usando caratteri jolly, simili ai caratteri jolly usati in Windows. La flessibilità è tuttavia superiore, perché sono consentiti più caratteri jolly.

Prerequisiti

Il primo passaggio consiste nel creare un database in cui è possibile eseguire le query. Inizializzare quindi gli oggetti eseguendo uno script di installazione in tale database. Questo script di installazione crea le origini dati, le credenziali con ambito database e i formati di file esterni usati in questi esempi.

Usare la cartella csv/taxi per seguire le query di esempio. Contiene i dati nyc Taxi - Yellow Taxi Trip Records da luglio 2016 a giugno 2018. I file in csv/taxi sono denominati dopo anno e mese usando il modello seguente:

yellow_tripdata_<year>-<month>.csv*

Leggere tutti i file nella cartella

L'esempio seguente legge tutti i file di dati nyc Yellow Taxi dalla cartella csv/taxi e quindi restituisce il numero totale di passeggeri e corse all'anno. Illustra inoltre l'uso delle funzioni di aggregazione.

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);

Nota

Tutti i file a cui si accede con il singolo OPENROWSET devono avere la stessa struttura (numero di colonne e relativi tipi di dati).

Leggere subset di file nella cartella

L'esempio seguente legge i file di dati 2017 NYC Yellow Taxi dalla cartella csv/taxi usando un carattere jolly e restituisce l'importo totale della tariffa per tipo di pagamento.

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;

Nota

Tutti i file a cui si accede con il singolo OPENROWSET devono avere la stessa struttura (numero di colonne e relativi tipi di dati).

Leggere il subset di file nella cartella usando più percorsi di file

L'esempio seguente legge i file di dati 2017 NYC Yellow Taxi dalla cartella csv/taxi usando due percorsi di file. Il primo usa il percorso completo del file contenente i dati del mese di gennaio e il secondo usa un carattere jolly per leggere i mesi ottobre, novembre e dicembre. Per ogni percorso, viene restituito l'importo totale della tariffa per tipo di pagamento.

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;

Nota

Tutti i file a cui si accede con il singolo OPENROWSET devono avere la stessa struttura (numero di colonne e relativi tipi di dati).

Leggere cartelle

Il percorso fornito da OPENROWSET può anche essere un percorso di una cartella. Le sezioni seguenti includono questi tipi di query.

Leggere tutti i file di una cartella specifica

È possibile leggere tutti i file in una cartella usando il carattere jolly a livello di file, come illustrato in Leggere tutti i file nella cartella. Esiste tuttavia un modo per eseguire query su una cartella e utilizzare tutti i file all'interno di tale cartella.

Se il percorso specificato in OPENROWSET punta a una cartella, tutti i file in tale cartella vengono usati come origine per la query. La query seguente legge tutti i file nella cartella csv/taxi .

Nota

Si noti l'esistenza di / alla fine del percorso nella query. Indica che si tratta di una cartella. Se l'oggetto / viene omesso, la query è destinata a un file denominato 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);

Nota

Tutti i file a cui si accede con il singolo OPENROWSET devono avere la stessa struttura (numero di colonne e relativi tipi di dati).

Leggere tutti i file in più cartelle

È possibile leggere i file in più cartelle usando un carattere jolly. La query seguente legge tutti i file di tutte le cartelle presenti nella cartella csv con nomi che iniziano con t e terminano con i.

Nota

Si noti l'esistenza di / alla fine del percorso nella query. Indica che si tratta di una cartella. Se l'oggetto / viene omesso, la query è destinata ai file denominati 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);

Nota

Tutti i file a cui si accede con il singolo OPENROWSET devono avere la stessa struttura (numero di colonne e relativi tipi di dati).

Poiché è presente una sola cartella che corrisponde ai criteri, il risultato della query è uguale a quello ottenuto in Leggere tutti i file presenti nella cartella.

Attraversare le cartelle in modo ricorsivo

Il pool SQL serverless può attraversare in modo ricorsivo le cartelle se si specifica /** alla fine del percorso. La query seguente legge tutti i file da tutte le cartelle e le sottocartelle presenti nella cartella 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);

Nota

Tutti i file a cui si accede con il singolo OPENROWSET devono avere la stessa struttura (numero di colonne e relativi tipi di dati).

Usare più caratteri jolly

È possibile usare più caratteri jolly a livelli di percorso diversi. Ad esempio, è possibile arricchire una query precedente per leggere i file solo con dati 2017, da tutte le cartelle in cui i nomi iniziano con t e terminano con i.

Nota

Si noti l'esistenza di / alla fine del percorso nella query. Indica che si tratta di una cartella. Se l'oggetto / viene omesso, la query è destinata ai file denominati t*i . Esiste un limite massimo di 10 caratteri jolly per ogni query.

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);

Nota

Tutti i file a cui si accede con il singolo OPENROWSET devono avere la stessa struttura (numero di colonne e relativi tipi di dati).

Poiché è presente una sola cartella che corrisponde ai criteri, il risultato della query è uguale a Leggere il subset di file presente nella cartella e Leggere tutti i file di una cartella specifica. Per scenari di utilizzo con caratteri jolly più complessi, vedere Eseguire query su file Parquet.

Passaggio successivo