首页 > 解决方案 > 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参数指定一个较大的数字,因为我不介意在执行此查询时是否只丢失了几个文件,但这似乎只适用于行级别的错误,而这些错误位于文件级别.BULKOPENROWSET

查询在内置无服务器池上运行。

任何有关如何解决此问题的想法将不胜感激。

标签: azureazure-synapseazure-data-lake-gen2

解决方案


对于连接到 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
)

如果您已将其锁定,另请参阅该文章中有关存储帐户防火墙的部分。


推荐阅读