PolyBase Transact-SQL 参考
适用于:SQL Server
本文回顾了使用 PolyBase 就地查询各种外部数据源的外部数据(称为数据虚拟化)的选项。
PolyBase 中使用的 T-SQL 语法
若要使用 PolyBase,必须创建外部表来引用外部数据。 请参阅:
- CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)
- CREATE EXTERNAL DATA SOURCE (Transact-SQL)
- CREATE EXTERNAL FILE FORMAT (Transact-SQL)
- CREATE EXTERNAL TABLE (Transact-SQL)
- CREATE STATISTICS (Transact-SQL)
注意
若要使用 PolyBase,必须对数据库具有 sysadmin 或 CONTROL SERVER 级别的权限。
教程
有关查询示例,请参阅 PolyBase Queries。
有关各种外部数据源的更多教程,请参阅:
文件元数据函数
有时,可能会需要知道哪个文件或文件夹源与结果集中的某个特定行相关。
可以使用函数 filepath
和 filename
在结果集中返回文件名称和/或路径。 或者,可以使用它们根据文件名和/或文件夹路径来筛选数据。 在以下部分中,你将找到有关示例的简短说明。
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;