Dela via


Använda filmetadata i serverlösa SQL-poolfrågor

I den här artikeln får du lära dig hur du frågar efter specifika filer eller mappar med hjälp av metadata. Serverlös SQL-pool kan hantera flera filer och mappar. Mer information finns i Frågemappar och flera filer.

Ibland kan du behöva veta vilken fil- eller mappkälla som korrelerar med en viss rad i en resultatuppsättning. Du kan använda funktionerna filepath och filename för att returnera filnamn och/eller sökvägen i resultatuppsättningen, eller så kan du använda dem för att filtrera data baserat på filnamnet eller mappsökvägen. Dessa funktioner beskrivs i filnamnsfunktionen och filsökvägsfunktionen.

Följande avsnitt innehåller korta beskrivningar och kodexempel.

Förutsättningar

Ditt första steg är att skapa en databas med en datakälla som refererar till ett lagringskonto. Initiera sedan objekten genom att köra ett installationsskript på databasen. Det här installationsskriptet skapar de datakällor, databasomfattningsautentiseringsuppgifter och externa filformat som används i dessa exempel.

Funktioner

Filnamn

Funktionen filename returnerar filnamnet där raden kommer från.

Följande exempel läser datafilerna för NYC Yellow Taxi för september 2017 och returnerar antalet turer per fil. Delen OPENROWSET av frågan anger vilka filer som ska läsas.

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

I följande exempel visas hur filename() du kan använda i WHERE -satsen för att filtrera de filer som ska läsas. Den kommer åt hela mappen i delen OPENROWSET av frågan och filtrerar filerna i WHERE -satsen.

Resultatet blir detsamma som i föregående exempel.

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

Filsökväg

Funktionen filepath returnerar en fullständig eller partiell sökväg:

  • När den anropas utan en parameter returneras den fullständiga filsökvägen där raden kommer från. När DATA_SOURCE används i OPENROWSETreturnerar den sökvägen i förhållande till DATA_SOURCE.
  • När den anropas med en parameter returneras en del av sökvägen som matchar jokertecknet på den position som anges i parametern. Parametervärdet 1 returnerar till exempel en del av sökvägen som matchar det första jokertecknet.

Följande exempel läser NYC Yellow Taxi-datafiler för de senaste tre månaderna av 2017. Det returnerar antalet turer per filsökväg. Delen OPENROWSET av frågan anger vilka filer som ska läsas.

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;

I följande exempel visas hur filepath() du kan använda i WHERE -satsen för att filtrera de filer som ska läsas.

Du kan använda jokertecken i delen OPENROWSET av frågan och filtrera filerna i WHERE -satsen. Resultatet blir detsamma som i föregående exempel.

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;

Gå vidare