来自外部表的 Polybase 查询不支持拒绝选项
Posted
技术标签:
【中文标题】来自外部表的 Polybase 查询不支持拒绝选项【英文标题】:Polybase query from external table not honoring reject options 【发布时间】:2021-11-15 02:32:55 【问题描述】:我们正在运行带有 CU 12 的 SQL 2019,其外部数据源指向 ADLS Gen2 存储帐户。我们在同一个目录中有两个 parquet 文件,其中一个文件有 2 列,另一个文件有 3 列。我们故意这样做是为了测试拒绝选项,因为我们知道我们的架构会随着时间而改变。
/employee/file1.csv(2 列/5 行)
/employee/file2.csv(3 列/5 行)
根据拒绝选项的文档,如果拒绝行属于下面列出的拒绝配置,我们应该能够查询外部表并在结果集中返回非脏行。
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-external-table-transact-sql?view=sql-server-ver15&tabs=dedicated
CREATE EXTERNAL TABLE [dbo].[Employee] (
[FirstName] varchar(100) NOT NULL,
[LastName] varchar(100) NOT NULL
)
WITH (LOCATION='/employee/',
DATA_SOURCE = DATA_LAKE,
FILE_FORMAT = ParquetFileFormat,
REJECT_TYPE = VALUE,
REJECT_VALUE = 1000000
);
当我们从外部表中选择时,我希望它从一个包含 2 列的文件中返回 5 行,并从包含 3 列的文件中拒绝 5 行。相反,除了以下异常,我们根本没有得到任何行。
创建记录读取器时遇到意外错误。 HadoopExecutionException:列数不匹配。源文件有 3 列,外部表定义有 2 列。
我觉得我一定遗漏了一些东西,或者我对拒绝选项如何支持文件架构差异的理解不正确。任何人都可以对此有所了解吗?
【问题讨论】:
【参考方案1】:Polybase 的工作方式是它首先查询两个文件的模式,看看它们是否符合规范;因为他们没有,Polybase 不会成功查询一个文件,而在另一个文件上失败。这两个文件都必须首先遵守外部表规范,然后您可以拥有一些具有两列的记录和其他具有三列的记录。您可以在我的“使用 Polybase 进行数据虚拟化实践”一书中了解有关 Polybase 工作原理的更多信息。
【讨论】:
嗯...我们有一些关于此的附加信息。仅当文件格式为 parquet 时才会出现此问题。在使用两个原始 CSV 文件(每个文件的列数不同)完全相同的情况下,拒绝选项按预期工作,我们从满足外部表定义的文件中获取所有行。以上是关于来自外部表的 Polybase 查询不支持拒绝选项的主要内容,如果未能解决你的问题,请参考以下文章
使用 Polybase 在 SQL Server 2016 中创建外部表的问题
SQL Server 2019 中 Polybase 外部表的行级安全性可能吗?
Polybase 外部表与 OPENROWSET 无服务器 sql 池架构
Azure Synapse Polybase/外部表 - 仅返回最新文件