1

为什么对 Azure Data Lake Gen 2 的 Azure SQL 数据仓库 Polybase 查询会为单个文件源返回多行,但为父文件夹源返回零行?

我建立:

  • 万能钥匙(CREATE MASTER KEY;)
  • 凭据 (CREATE DATABASE SCOPED CREDENTIAL) - 使用 ADLS Gen 2 帐户密钥
  • 外部数据源(CREATE EXTERNAL DATA SOURCE)
  • 文件格式(创建外部文件格式)
  • 外部表(创建外部表)

当我的外部表指向特定文件时,一切正常,即

CREATE EXTERNAL TABLE [ext].[Time]
(
    [TimeID] int NOT NULL,
    [HourNumber] tinyint NOT NULL,
    [MinuteNumber] tinyint NOT NULL,
    [SecondNumber] tinyint NOT NULL,
    [TimeInSecond] int NOT NULL,
    [HourlyBucket] varchar(15) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
)
WITH
(
    LOCATION = '/Time/time001.txt',
    DATA_SOURCE = ADLSDataSource,
    FILE_FORMAT = uncompressedcsv,
    REJECT_TYPE = value,
    REJECT_VALUE = 2147483647
);
SELECT * FROM [ext].[Time];

返回了很多行,因此我相信上面提到的所有项目都配置正确。

Azure Data Lake Gen 2 中的 Time 文件夹包含许多文件,而不仅仅是 time001.txt。当我将外部表更改为指向文件夹而不是单个文件时,查询返回零行,即

CREATE EXTERNAL TABLE [ext].[Time]
(
    [TimeID] int NOT NULL,
    [HourNumber] tinyint NOT NULL,
    [MinuteNumber] tinyint NOT NULL,
    [SecondNumber] tinyint NOT NULL,
    [TimeInSecond] int NOT NULL,
    [HourlyBucket] varchar(15) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
)
WITH
(
    LOCATION = '/Time/',
    DATA_SOURCE = ADLSDataSource,
    FILE_FORMAT = uncompressedcsv,
    REJECT_TYPE = value,
    REJECT_VALUE = 2147483647
);
SELECT * FROM [ext].[Time];

返回零行

我试过了:

  • LOCATION = '/时间/',
  • 位置 = '/时间',
  • 位置='时间/',
  • 位置='时间',

但总是零行。我还按照https://docs.microsoft.com/en-us/azure/synapse-analytics/sql-data-warehouse/sql-data-warehouse-load-from-azure-data-lake-store上的说明进行操作

我测试了文件夹中的所有文件,并分别返回多行数据。

我从 Blob 存储而不是 ADLS Gen2 中查询了所有文件,并且“文件夹”查询按预期返回所有行。

如何使用 Azure SQL 数据仓库和 Polybase 从 Azure Data Lake Gen2 存储中“作为一个”查询文件夹中的所有文件?

4

1 回答 1

0

我面临着完全相同的问题:问题出在数据源协议上。

有错误的脚本:

   CREATE EXTERNAL DATA SOURCE datasourcename
   WITH (
       TYPE = HADOOP,
       LOCATION = 'abfss://container@storage.blob.core.windows.net',
       CREDENTIAL = credential_name

解决问题的脚本:

   CREATE EXTERNAL DATA SOURCE datasourcename
   WITH (
       TYPE = HADOOP,
       LOCATION = 'abfss://container@storage.dfs.core.windows.net',
       CREDENTIAL = credential_name

唯一需要改变的是位置。

感谢 Microsoft 支持团队在这方面为我提供的帮助。

于 2021-04-19T20:29:18.843 回答