无法创建从 Azure Blob 存储容器到 Azure Sql 数据库超大规模的外部数据源

Posted

技术标签:

【中文标题】无法创建从 Azure Blob 存储容器到 Azure Sql 数据库超大规模的外部数据源【英文标题】:Can't create an external data source from Azure Blob Storage Container to Azure Sql Database Hyperscale 【发布时间】:2020-12-15 13:35:25 【问题描述】:

我已将单个文件 (BlockBlob) 上传到 Azure BlobStorage 中的容器

这是路径:https://myStorageName.blob.core.windows.net/myContainerName/myFolder.Name/myFileName.json

我想将此文件加载到 Azure Sql 数据库中的表中

如果我为该文件创建一个 SAS,则一切正常。但是,我无法生成可以访问容器内多个文件的单个 SAS。

这是有效的代码:

CREATE DATABASE SCOPED CREDENTIAL TemporaryBlobSCredential
 WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
 SECRET = 'sp=......................'

CREATE EXTERNAL DATA SOURCE TemporaryBlobDataSource
 WITH ( TYPE = BLOB_STORAGE,
       LOCATION = 'https://<myStorageName>.blob.core.windows.net/<myContainerName>',
       CREDENTIAL= TemporaryBlobSCredential);

create table <tableName>
(JsonData varchar(max))
 
BULK INSERT <tableName>
FROM '<myFolder.Name>/<myFileName>.json'
WITH (DATA_SOURCE = 'TemporaryBlobDataSource');
 

如果我生成具有所有权限的 SAS (SECRET = '?sv=......'),它将无法工作:

我应该使用不同的东西吗? 它甚至有效吗?

【问题讨论】:

【参考方案1】:

我刚刚尝试运行您共享的代码,它与粘贴的代码非常相似 here 。如果您在页面上向上滚动,“适用于”不会调出突触/SQL DW。您确定您使用的是 Synapse 吗? SQL 池不支持 BULK INERT。

无论如何,如果您通常使用 Synapse,我们可以使用 COPY INTO 命令,但在您的情况下,我们有不支持的 JSON 格式。我认为您可以使用 Azure 数据工厂

【讨论】:

你是对的。多任务处理并不总是有效。我刚刚编辑了问题,但 Greg 已经是对的了。【参考方案2】:

这个document 说:

警告

SAS 键值可能以“?”开头(问号)。什么时候 如果您使用 SAS 密钥,则必须删除前导“?”。否则你的 努力可能会受阻。

我注意到您的工作代码中没有“?”,但您的 SAS 令牌中有一个不起作用。你能仔细检查一下这个小差异不是问题吗?

【讨论】:

以上是关于无法创建从 Azure Blob 存储容器到 Azure Sql 数据库超大规模的外部数据源的主要内容,如果未能解决你的问题,请参考以下文章

使用 Nodejs 将文件从 Azure 存储 blob(容器)复制到 Azure 文件共享

Azure:使用容器创建存储帐户并在 Python 中将 blob 上传到其中

Azure 存储模拟器访问 Blob 时出错

无法在Azure blob存储$ root容器中创建文件夹

Powershell:创建 Az 副本到 blob 容器日志文件或详细

如何将所有文件从 blob 存储容器导入和处理到 azure databricks