azure - Azure Synapse:无法批量加载,因为无法打开文件。操作系统错误代码12(访问代码无效。)
问题描述
我正在使用 Azure Synapse 查询大量 CSV 文件,OPENROWSET
命令请参见此处。这些文件位于通过托管标识连接到 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'
)
我已经尝试为in的MAXERRORS
参数指定一个较大的数字,因为我不介意在执行此查询时是否只丢失了几个文件,但这似乎只适用于行级别的错误,而这些错误位于文件级别.BULK
OPENROWSET
查询在内置无服务器池上运行。
任何有关如何解决此问题的想法将不胜感激。
解决方案
对于连接到 Synapse 无服务器的任何 AAD 用户(如果您使用 SQL 登录,这将失败),您的代码正在通过身份验证到存储。要使用 MSI 连接到存储,您需要一个数据库范围的凭证,并且需要在外部数据源中引用它,如本例所示。
-- 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
)
如果您已将其锁定,另请参阅该文章中有关存储帐户防火墙的部分。
推荐阅读
- python - 从 Scikit-Learn 决策树模型中获取特定数据
- ruby - 有人可以用 Ruby 正则表达式帮助我检查任何以 t 开头并以 r 结尾的字母并用单词 Twitter 替换的单词吗?谢谢
- python - 在 Windows 10 上使用 Python 进行多处理时的最大工作人员数
- sql - 如何修复 SQL Server 2014 中的错误“找不到 NewSettings.vssettings”
- python - 根据另一列删除列中的重复单词
- node.js - 如何从我的 Nodejs 程序进行此 API 调用?
- python - 根据 pandas 中的原始值计算运行总计
- javascript - 在 Vuejs 的 TextBox/Input 中更改或输入值
- python - Windows 中 python 的 termios 模块是什么?
- javascript - 如何在 HTML 输入文本占位符中显示特定的 JS 数组元素?