Efterfråga mappar och flera filer

I den här artikeln får du lära dig hur du skriver en fråga med hjälp av en serverlös SQL-pool i Azure Synapse Analytics.

Serverlös SQL-pool stöder läsning av flera filer/mappar med jokertecken, som liknar de jokertecken som används i Windows OS. Det finns dock större flexibilitet eftersom flera jokertecken tillåts.

Förutsättningar

Det första steget är att skapa en databas där du kör frågorna. Initiera sedan objekten genom att köra installationsskriptet på databasen. Det här installationsskriptet skapar datakällor, databasbegränsade autentiseringsuppgifter och externa filformat som används i dessa exempel.

Du använder mappen csv/taxi för att följa exempelfrågorna. Den innehåller data om NYC Taxi – Yellow Taxi Trip Records från juli 2016 till juni 2018. Filer i csv/taxi namnges efter år och månad med följande mönster: yellow_tripdata_<årsmånad><>.csv

Läsa alla filer i mappen

Exemplet nedan läser alla datafiler för NYC Yellow Taxi från mappen csv/taxi och returnerar det totala antalet passagerare och resor per år. Den visar också användningen av mängdfunktioner.

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

Anteckning

Alla filer som nås med en enda OPENROWSET måste ha samma struktur (t.ex. antalet kolumner och deras datatyper).

Läsa delmängd av filer i mappen

Exemplet nedan läser datafilerna för New York Yellow Taxi 2017 från mappen csv/taxi med ett jokertecken och returnerar det totala biljettbeloppet per betalningstyp.

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;

Anteckning

Alla filer som nås med en enda OPENROWSET måste ha samma struktur (t.ex. antalet kolumner och deras datatyper).

Läsa delmängd av filer i mappen med hjälp av flera filsökvägar

Exemplet nedan läser 2017 NYC Yellow Taxi-datafilerna från mappen csv/taxi med hjälp av 2 filsökvägar först en med fullständig sökväg till filen som innehåller data från januari månad och sekund med jokerteckenläsningsmånaderna november och december som returnerar det totala biljettbeloppet per betalningstyp.

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;

Anteckning

Alla filer som nås med en enda OPENROWSET måste ha samma struktur (t.ex. antalet kolumner och deras datatyper).

Läsa mappar

Sökvägen till OPENROWSET kan också vara en sökväg till en mapp. Följande avsnitt innehåller dessa frågetyper.

Läsa alla filer från en specifik mapp

Du kan läsa alla filer i en mapp med jokertecken på filnivå som du ser i Läsa alla filer i mappen. Men det finns ett sätt att köra frågor mot en mapp och använda alla filer i mappen.

Om sökvägen i OPENROWSET pekar på en mapp används alla filer i mappen som källa för din fråga. Följande fråga läser alla filer i mappen csv/taxi .

Anteckning

Observera förekomsten av / i slutet av sökvägen i frågan nedan. Den anger en mapp. Om / utelämnas riktas frågan mot en fil med namnet taxi i stället.

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

Anteckning

Alla filer som nås med en enda OPENROWSET måste ha samma struktur (t.ex. antalet kolumner och deras datatyper).

Läsa alla filer från flera mappar

Det går att läsa filer från flera mappar med hjälp av ett jokertecken. Följande fråga läser alla filer från alla mappar i csv-mappen som har namn som börjar med t och slutar med i.

Anteckning

Observera förekomsten av / i slutet av sökvägen i frågan nedan. Den anger en mapp. Om /utelämnas kommer frågan att rikta in sig på filer med namnet t*i i stället.

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

Anteckning

Alla filer som nås med en enda OPENROWSET måste ha samma struktur (t.ex. antalet kolumner och deras datatyper).

Eftersom du bara har en mapp som matchar kriterierna är frågeresultatet detsamma som Läsa alla filer i mappen.

Bläddra igenom mappar rekursivt

Serverlös SQL-pool kan rekursivt bläddra i mappar om du anger /** i slutet av sökvägen. Följande fråga läser alla filer från alla mappar och undermappar som finns i mappen 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);

Anteckning

Alla filer som nås med en enda OPENROWSET måste ha samma struktur (t.ex. antalet kolumner och deras datatyper).

Flera jokertecken

Du kan använda flera jokertecken på olika sökvägsnivåer. Du kan till exempel utöka föregående fråga för att läsa filer med endast 2017-data, från alla mappar som namn börjar med t och slutar med i.

Anteckning

Observera förekomsten av / i slutet av sökvägen i frågan nedan. Den anger en mapp. Om /utelämnas kommer frågan att rikta in sig på filer med namnet t*i i stället. Det finns en maxgräns på 10 jokertecken per fråga.

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

Anteckning

Alla filer som nås med en enda OPENROWSET måste ha samma struktur (t.ex. antalet kolumner och deras datatyper).

Eftersom du bara har en mapp som matchar kriterierna är frågeresultatet detsamma som underuppsättningen Läsa filer i mappen och Läsa alla filer från en specifik mapp. Mer komplexa användningsscenarier med jokertecken beskrivs i Query Parquet-filer.

Nästa steg

Mer information finns i artikeln Frågespecifika filer .