PolyBase Transact-SQL 参考

适用于:SQL Server

本文回顾了使用 PolyBase 就地查询各种外部数据源的外部数据(称为数据虚拟化)的选项。

PolyBase 中使用的 T-SQL 语法

若要使用 PolyBase,必须创建外部表来引用外部数据。 请参阅:

注意

若要使用 PolyBase,必须对数据库具有 sysadmin 或 CONTROL SERVER 级别的权限。

教程

有关查询示例,请参阅 PolyBase Queries

有关各种外部数据源的更多教程,请参阅:

文件元数据函数

有时,可能会需要知道哪个文件或文件夹源与结果集中的某个特定行相关。

可以使用函数 filepathfilename 在结果集中返回文件名称和/或路径。 或者,可以使用它们根据文件名和/或文件夹路径来筛选数据。 在以下部分中,你将找到有关示例的简短说明。

Filename 函数

此函数返回行的来源文件的名称。

返回数据类型为 nvarchar(1024)。 为了获得最佳性能,请始终将 filename 函数的结果强制转换为适当的数据类型。 如果使用字符数据类型,请确保使用适当的长度。

下面的示例读取 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();

下面的示例演示如何在 WHERE 子句中使用 filename(),以筛选要读取的文件。 它访问查询的 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 函数的结果强制转换为适当的数据类型。 如果使用字符数据类型,请确保使用适当的长度。

下面的示例读取 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;

下面的示例演示如何在 WHERE 子句中使用 filepath(),以筛选要读取的文件。

可以在查询的 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;