Dela via


PolyBase-Transact-SQL-referensen

Gäller för:SQL Server

Den här artikeln granskar alternativ för att använda PolyBase för att fråga externa data på plats, som kallas datavirtualisering, för en mängd olika externa datakällor.

T-SQL-syntax som används i PolyBase

Om du vill använda PolyBase måste du skapa externa tabeller för att referera till dina externa data. Läs mer:

Anmärkning

För att kunna använda PolyBase måste du ha behörigheter på sysadmin- eller CONTROL SERVER-nivå för databasen.

Handledningar

Exempel på frågor finns i PolyBase-frågor.

Fler självstudier om olika externa datakällor finns i:

Filmetadata funktioner

Ibland kan du behöva veta vilken fil- eller mappkälla som motsvarar en specifik rad i resultatuppsättningen.

Du kan använda funktioner filepath och filename returnera filnamn och/eller sökvägen i resultatuppsättningen. Eller så kan du använda dem för att filtrera data baserat på filnamn och/eller mappväg. I följande avsnitt hittar du korta beskrivningar tillsammans med exempel.

Filnamnsfunktion

Denna funktion returnerar filnamnet som raden kommer ifrån.

Returdatatypen är nvarchar(1024). För optimal prestanda, kasta alltid resultatet av filnamnsfunktionen till lämplig datatyp. Om du använder teckendatatyp, se till att lämplig längd används.

Följande exempel läser NYC Yellow Taxi-datafilerna för de sista tre månaderna av 2017 och återger antalet resor per fil. Den OPENROWSET del av frågan specificerar 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();

Följande exempel visar hur filename() kan användas i klausulen WHERE för att filtrera filerna som ska läsas. Den får tillgång till hela mappen i delen OPENROWSET av frågan och filtrerar filer i klausulen WHERE .

Dina resultat kommer att vara desamma som i det tidigare exemplet.

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

Filvägsfunktion

Denna funktion returnerar en fullständig väg eller en del av vägen:

  • När den anropas utan parameter, returnerar den hela filvägen som en rad kommer ifrån.
  • När den anropas med parameter, returnerar den en del av vägen som matchar jokern på positionen som anges i parametern. Till exempel skulle parametervärde 1 returnera en del av vägen som matchar det första jokerkortet.

Returdatatypen är nvarchar(1024). För optimal prestanda, kasta alltid resultatet av filepath funktionen till lämplig datatyp. Om du använder teckendatatyp, se till att lämplig längd används.

Följande exempel visar NYC Yellow Taxi-datafiler för de sista tre månaderna av 2017. Den returnerar antalet turer per filväg. Den OPENROWSET del av frågan specificerar 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;

Följande exempel visar hur filepath() kan användas i klausulen WHERE för att filtrera filerna som ska läsas.

Du kan använda jokrarna i den OPENROWSET del av frågan och filtrera filerna i klausulen WHERE . Dina resultat kommer att vara desamma som i det tidigare exemplet.

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;