5

我正在尝试通过 polybase 在 Visual Studio 2015 上使用以下语法创建外部表。它给了我以下错误。有人可以帮忙吗

CREATE EXTERNAL TABLE dbo.DimDate2External (
    DateId INT NOT NULL,
    CalendarQuarter TINYINT NOT NULL,
    FiscalQuarter TINYINT NOT NULL
)
WITH (
    LOCATION='/textfiles/DimDate2.txt',
    DATA_SOURCE=AzureStorage,
    FILE_FORMAT=TextFile
);

CREATE EXTERNAL DATA SOURCE AzureStorage
WITH ( 
    TYPE = HADOOP, 
    LOCATION = 'wasbs://<blob_container_name>@<azure_storage_account_name>.‌​blob.core.windows.ne‌​t', 
    CREDENTIAL = AzureStorageCredential
    ); 

CREATE EXTERNAL FILE FORMAT TextFile WITH ( FORMAT_TYPE = DelimitedText, FORMAT_OPTIONS (FIELD_TERMINATOR = ',') );

由于内部错误,EXTERNAL TABLE 访问失败:

'调用 HdfsBridge_IsDirExist 时引发 Java 异常。Java 异常消息:com.microsoft.azure.storage.StorageException:服务器未能对请求进行身份验证。确保 Authorization 标头的值格式正确,包括签名。:错误 [com.microsoft.azure.storage.StorageException:服务器无法对请求进行身份验证。确保 Authorization 标头的值正确形成,包括签名。] 访问外部文件时发生。

4

2 回答 2

6

在“位置”语法中,我错误地放错了 Blob 容器和存储帐户并收到此错误。现在它固定了。

创建外部数据源 AzureStorage (TYPE = HADOOP, LOCATION = 'wasbs://@.‌​blob.core.windows.ne‌​t', CREDENTIAL = AzureStorageCredential)

于 2017-01-23T07:18:26.737 回答
3

XXX如果您的外部数据源的 Azure 存储帐户元素不正确(在我的示例中),我可以重现此错误:

CREATE EXTERNAL DATA SOURCE eds_dummy
WITH (  
    TYPE = Hadoop,
    LOCATION = 'wasbs://dummy@XXX.blob.core.windows.net',
    CREDENTIAL = sc_tpch
);

如果 blob 容器名称不正确(dummy在我的示例中)但存储帐户正确,则在尝试创建表时会收到非常具体的错误消息:

消息 105002,级别 16,状态 1,第 27 行外部表访问失败,因为指定的路径名​​“/test.txt”不存在。请输入有效路径,然后重试。

似乎对 blob 容器进行了某种验证。但是,如果Azure 存储帐户名称不正确,则在创建外部数据源时不会出现错误,只有在尝试创建表时才会出现错误:

消息 105019,级别 16,状态 1,第 35 行外部表访问因内部错误而失败:“调用 HdfsBridge_IsDirExist 时引发 Java 异常。Java 异常消息:com.microsoft.azure.storage.StorageException:服务器遇到未知故障::错误 [com.microsoft.azure.storage.StorageException:服务器遇到未知故障:] 访问外部文件时发生。

若要更正,请确保 Azure 存储帐户和 Blob 容器存在。

最简单的方法是从门户复制文件或文件夹的 URL 并将其修复为外部表,即:

https://yourStorageAccountName.blob.core.windows.net/yourBlobContainerName

对此:

wasbs://yourBlobContainerName@yourStorageAccountName.blob.core.windows.net

祝你好运。

于 2017-01-21T18:35:23.767 回答