【问题标题】:Azure Synapse: Cannot bulk load because the file could not be opened. Operating system error code 12(The access code is invalid.)Azure Synapse:无法批量加载,因为无法打开文件。操作系统错误代码12(访问代码无效。)
【发布时间】: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.)

这里&lt;file&gt; 每次运行查询时都是一个不同的文件。如果我导航到链接数据视图中的文件,我可以下载并查看该文件。此外,如果我指定对前面提到的文件运行查询,它会正常工作。

我用来查询数据湖的代码如下:

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

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

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

【问题讨论】:

    标签: azure azure-synapse azure-data-lake-gen2


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2013-10-29
        • 2018-04-18
        • 2020-02-08
        • 2021-02-06
        • 2021-02-26
        • 2013-01-11
        • 2021-12-27
        • 1970-01-01
        • 2021-01-29
        相关资源
        最近更新 更多