Azure Synapse:无法批量加载,因为无法打开文件。操作系统错误代码12(访问代码无效。)
Posted
技术标签:
【中文标题】Azure Synapse:无法批量加载,因为无法打开文件。操作系统错误代码12(访问代码无效。)【英文标题】:Azure Synapse: Cannot bulk load because the file could not be opened. Operating system error code 12(The access code is invalid.) 【发布时间】:2021-10-30 04:25:52 【问题描述】:我正在使用 Azure Synapse 通过 OPENROWSET
命令 see here 查询大量 CSV 文件。这些文件位于通过托管标识连接到 Azure Synapse 的 Data Lake gen 2 上。
当我一次只查询几个文件时,这工作正常,但是当我增加我试图同时查询的文件数量时,我收到以下错误:
Azure Synapse: Cannot bulk load because the file <file> could not be opened. Operating system error code 12(The access code is invalid.)
这里<file>
每次运行查询时都是一个不同的文件。如果我导航到链接数据视图中的文件,我可以下载并查看该文件。此外,如果我指定对前面提到的文件运行查询,它会正常工作。
我用来查询数据湖的代码如下:
SELECT
Parsed.*
FROM OPENROWSET
(
bulk '2021/*/**.log',
maxerrors = 2147483647,
data_source = 'analytics',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b'
) WITH (doc nvarchar(max)) AS Rows
CROSS APPLY OPENJSON(Rows.doc)
WITH
(
col1 NVARCHAR(100),
col2 NVARCHAR(100),
...,
coln NVARCHAR(MAX)
) AS Parsed
这里是数据源,analytics
是一个数据源,指定如下:
CREATE EXTERNAL DATA SOURCE analytics
WITH
(
location = 'https://<url>.dfs.core.windows.net/analytics'
)
我尝试为OPENROWSET
中的BULK
的MAXERRORS
参数指定一个较大的数字,因为我不介意在执行此查询时是否只丢失了几个文件,但这似乎只适用于错误的行级别,这些错误在文件级别。
查询正在内置无服务器池上运行。
任何有关如何解决此问题的想法都将不胜感激。
【问题讨论】:
【参考方案1】:对于连接到 Synapse 无服务器的任何 AAD 用户(如果您使用 SQL 登录,这将失败),您的代码正在通过身份验证传递给存储。要使用 MSI 连接到存储,您需要一个数据库范围的凭据,并且需要在外部数据源中引用它,如 example 中所示。
-- Optional: Create MASTER KEY if not exists in database:
-- CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Very Strong Password>
CREATE DATABASE SCOPED CREDENTIAL SynapseIdentity
WITH IDENTITY = 'Managed Identity';
GO
CREATE EXTERNAL DATA SOURCE mysample
WITH ( LOCATION = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>',
CREDENTIAL = SynapseIdentity
)
如果您已将其锁定,另请参阅该文章中有关存储帐户防火墙的部分。
【讨论】:
【参考方案2】:只需为此添加一个快速答案。在进行 Greg 建议的更改后,我能够查询更多数据 - 但仍然遇到错误代码 12。
我与 Azure 支持人员进行了交谈,他们告诉我错误消息实际上是 412(但我看不到);所以这个隐含的文件正在使用/正在修改。添加以下内容允许 Azure Synapse 忽略此内容并查询文件:
ROWSET_OPTIONS = '"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]'
或者对于外部表:
TABLE_OPTIONS = N'"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]'
这是我最后的查询:
SELECT
Parsed.*
FROM OPENROWSET
(
bulk '2021/*/**.log',
maxerrors = 2147483647,
data_source = 'analytics_master_key',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b',
ROWSET_OPTIONS = '"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]'
) WITH (doc nvarchar(max)) AS Rows
CROSS APPLY OPENJSON(Rows.doc)
WITH
(
col1 NVARCHAR(100),
col2 NVARCHAR(100),
...,
coln NVARCHAR(MAX)
) AS Parsed
【讨论】:
以上是关于Azure Synapse:无法批量加载,因为无法打开文件。操作系统错误代码12(访问代码无效。)的主要内容,如果未能解决你的问题,请参考以下文章
Azure blob 到 Azure SQL 数据库:无法批量加载,因为无法打开文件“xxxx.csv”。操作系统错误代码 5(访问被拒绝。)
从 Azure Sql 迁移到 Azure Synapse,无法连接到 Airflow 中的 Synapse
Azure Synapse Studio - 无法创建 SQL 池
SqlServerRegionDoesNotAllowProvisioning:无法创建 Azure Synapse Analytics 工作区