Používání souborových metadat v dotazech bezserverového fondu SQL

Tip

Microsoft Fabric Data Warehouse je relační sklad v podnikovém měřítku na základu datového jezera s architekturou připravenou pro budoucnost, integrovanou AI a novými funkcemi. Pokud s datovými sklady začínáte, začněte pracovat s Fabric Data Warehouse. Stávající úlohy fondu dedikované SQL můžou upgradovat na Fabric a získat tak přístup k novým funkcím napříč datovou vědou, analýzou v reálném čase a reportováním.

V tomto článku se dozvíte, jak pomocí metadat dotazovat konkrétní soubory nebo složky. Bezserverový fond SQL může řešit více souborů a složek. Další informace naleznete v části Dotazování složek a několika souborů.

Někdy může být potřeba vědět, který soubor nebo zdroj složky koreluje s konkrétním řádkem v sadě výsledků. Můžete použít funkce filepath a filename vrátit názvy souborů nebo cestu v sadě výsledků nebo je můžete použít k filtrování dat na základě názvu souboru nebo cesty ke složce. Tyto funkce jsou popsány ve funkci názvu souboru a funkci filepath.

Následující části obsahují krátké popisy a ukázky kódu.

Požadavky

Prvním krokem je vytvoření databáze se zdrojem dat, který odkazuje na účet úložiště. Potom inicializovat objekty spuštěním instalačního skriptu v této databázi. Tento instalační skript vytvoří zdroje dat, přihlašovací údaje v oboru databáze a formáty externích souborů, které se používají v těchto ukázkách.

Functions

Název souboru

Funkce filename vrátí název souboru, ze kterého pochází řádek.

Následující ukázka čte datové soubory NYC Yellow Taxi pro září 2017 a vrátí počet jízd na soubor. Část OPENROWSET dotazu určuje, které soubory se čtou.

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

Následující příklad ukazuje, jak filename() lze v WHERE klauzuli použít k filtrování souborů, které se mají číst. Přistupuje k celé složce v OPENROWSET části dotazu a filtruje soubory v klauzuli WHERE .

Výsledky budou stejné jako v předchozím příkladu.

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

Cesta k souboru

Funkce filepath vrátí úplnou nebo částečnou cestu:

  • Při zavolání bez parametru vrátí úplnou cestu k souboru, ze které pochází řádek. Při použití DATA_SOURCE v OPENROWSET vrátí cestu relativní k DATA_SOURCE.
  • Při zavolání s parametrem vrátí část cesty, která odpovídá zástupnému znaku na pozici určené v parametru. Například hodnota parametru 1 vrátí část cesty, která odpovídá prvnímu zástupnému znaku.

Následující ukázka čte datové soubory NYC Yellow Taxi za poslední tři měsíce roku 2017. Vrací počet jízd na cestu souboru. Část OPENROWSET dotazu určuje, které soubory se čtou.

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;

Následující příklad ukazuje, jak filepath() lze v WHERE klauzuli použít k filtrování souborů, které se mají číst.

Zástupné cardy můžete použít v OPENROWSET části dotazu a filtrovat soubory v klauzuli WHERE . Výsledky budou stejné jako v předchozím příkladu.

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;

Další krok