Поделиться через


Справочник по PolyBase Transact-SQL

Область применения:SQL Server

В этой статье рассматриваются варианты использования PolyBase для запроса внешних данных на месте, называемого виртуализацией данных для различных внешних источников данных.

Синтаксис T-SQL, используемый в PolyBase

Чтобы использовать PolyBase, необходимо создать внешние таблицы для ссылок на внешние данные. Обратитесь к

Примечание.

Чтобы использовать PolyBase, необходимо иметь роль системного администратора или разрешения на управление сервером базы данных.

Учебники

Примеры запросов см. в разделе Запросы PolyBase.

Дополнительные руководства по различным внешним источникам данных см. в следующем разделе:

Функции метаданных файлов

Иногда может потребоваться знать, какой файл или источник папок коррелирует с определенной строкой в результирующем наборе.

Вы можете использовать функции filepath и filename возвращать имена файлов и (или) путь в результирующем наборе. Также вы можете применить их для фильтрации данных по именам файлов и (или) путям к папкам. В следующих разделах содержатся краткие описания и примеры.

Функция имя файла

Эта функция возвращает имя файла, из которого получена строка.

Тип возвращаемых данных — nvarchar(1024). Для оптимальной производительности всегда преобразуйте результат функции filename к соответствующему типу данных. Если используется символьный тип данных, убедитесь, что используется соответствующая длина.

Следующий пример считывает файлы данных NYC Yellow Taxi за последние три месяца 2017 года и возвращает количество поездок в каждом файле. Часть OPENROWSET запроса указывает, какие файлы будут считываться.

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

В следующем примере показано, как filename() можно использовать в WHERE предложении для фильтрации файлов для чтения. Он обращается ко всей папке в OPENROWSET части запроса и фильтрует файлы в предложении WHERE .

Результаты будут такими же, как в предыдущем примере.

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

Функция filepath

Эта функция возвращает полный путь или часть пути:

  • При вызове без параметра возвращает полный путь к файлу, откуда исходит строка.
  • При вызове с параметром возвращает часть пути, которая соответствует подстановочным знакам по позиции, указанной в параметре. Например, при значении параметра 1 возвращается часть пути, соответствующая первому подстановочному знаку.

Тип возвращаемых данных — nvarchar(1024). Для оптимальной производительности всегда приводите результат функции filepath к соответствующему типу данных. Если используется символьный тип данных, убедитесь, что используется соответствующая длина.

Следующий пример читает файлы данных NYC Yellow Taxi за последние три месяца 2017 года. Он возвращает количество поездок на каждый путь файла. Часть OPENROWSET запроса указывает, какие файлы будут считываться.

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;

В следующем примере показано, как filepath() можно использовать в WHERE предложении для фильтрации файлов для чтения.

Вы можете использовать подстановочные знаки в OPENROWSET части запроса и отфильтровать файлы в предложении WHERE . Результаты будут такими же, как в предыдущем примере.

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;