Sdílet prostřednictvím


Referenční informace k Transact-SQL PolyBase

platí pro:SQL Server

Tento článek popisuje možnosti použití PolyBase k dotazování externích dat na místě, označovaných jako virtualizace dat, pro různé externí zdroje dat.

Syntaxe T-SQL použitá v PolyBase

Pokud chcete použít PolyBase, musíte vytvořit externí tabulky, které budou odkazovat na externí data. Přečtěte si:

Poznámka:

Abyste mohli používat PolyBase, musíte mít oprávnění na úrovni sysadmin nebo CONTROL SERVER pro databázi.

Tutorials

Příklady dotazů najdete v tématu Dotazy PolyBase.

Další kurzy o různých externích zdrojích dat najdete v následujících kurzech:

Funkce metadat souborů

Někdy je potřeba vědět, který zdroj souboru nebo složky koreluje s konkrétním řádkem ve výsledné sadě.

Můžete použít funkce filepath a filename k vrácení jmen souborů a/nebo cesty ve výsledné sadě. Nebo je můžete použít k filtrování dat podle názvu souboru a/nebo cesty k složce. V následujících sekcích najdete krátké popisy spolu se ukázkami.

Funkce názvu souboru

Tato funkce vrací název souboru, ze kterého řádek pochází.

Datový typ návratu je nvarchar(1024). Pro optimální výkon vždy přenášejte výsledek funkce názvu souboru na příslušný datový typ. Pokud použijete datový typ znaků, ujistěte se, že je použita vhodná délka.

Následující vzorek čte datové soubory NYC Yellow Taxi za poslední tři měsíce roku 2017 a vrací počet jízd v jednom souboru. Část OPENROWSET dotazu specifikuje, které soubory budou čteny.

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 klauzuli WHERE použít k filtrování souborů, které mají být čteny. Přistupuje k celé složce v OPENROWSET části dotazu a filtruje soubory v dané klauzuli WHERE .

Vaše 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];

Funkce cesty k souboru

Tato funkce vrací celou cestu nebo část cesty:

  • Při volání bez parametru vrací celou cestu k souboru, ze které řádek pochází.
  • Při volání parametrem vrací část cesty, která odpovídá divoké kartě na pozici uvedené v parametru. Například hodnota parametru 1 by vrátila část cesty, která odpovídá první divoké kartě.

Datový typ návratové hodnoty je nvarchar(1024). Pro optimální výkon vždy přenášejte výsledek filepath funkce na příslušný datový typ. Pokud použijete datový typ znakový, ujistěte se, že je použita vhodná délka.

Následující vzorek obsahuje 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 specifikuje, které soubory budou čteny.

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 klauzuli WHERE použít k filtrování souborů, které mají být čteny.

Můžete použít divoké karty v OPENROWSET části dotazu a filtrovat soubory v klauzuli WHERE . Vaše 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;