Запрос Polybase из хранилища данных SQL Azure к Azure Data Lake Gen 2 возвращает ноль строк

Почему запрос Polybase из хранилища данных SQL Azure к Azure Data Lake Gen 2 возвращает много строк для одного источника файла, но ноль строк для источника родительской папки?

Я создал:

  • Мастер-ключ (СОЗДАТЬ ГЛАВНЫЙ КЛЮЧ;)
  • Учетные данные (CREATE DATABASE SCOPED CREDENTIAL) - использует ключ учетной записи ADLS Gen 2
  • Внешний источник данных (СОЗДАТЬ ВНЕШНИЙ ИСТОЧНИК ДАННЫХ)
  • Формат файла (СОЗДАТЬ ВНЕШНИЙ ФОРМАТ ФАЙЛА)
  • Внешняя таблица (CREATE EXTERNAL TABLE)

Все работает нормально, когда моя внешняя таблица указывает на конкретный файл, т.е.

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];

Было возвращено много строк, поэтому я уверен, что все элементы, упомянутые выше, настроены правильно.

Папка Time в Azure Data Lake Gen 2 содержит множество файлов, а не только 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 = 'Время /',
  • 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 Data Lake Gen2 с помощью хранилища данных SQL Azure и Polybase?


person Andy Jones    schedule 09.04.2020    source источник
comment
Что вы вводите в учетные данные? Ключ учетной записи хранения? Токен SAS? Принципал службы?   -  person GregGalloway    schedule 10.04.2020
comment
Каковы настоящие имена папок и файлов? Я предполагаю, что ни один из файлов или родительских папок не начинается с «_» или «.»?   -  person GregGalloway    schedule 10.04.2020
comment
В учетных данных используется ключ учетной записи. Указание на конкретный файл возвращает данные, поэтому я считаю, что учетные данные хороши. Папка - это Время и файл time001.txt, без специальных символов, папок или файлов, начинающихся с _ или ..   -  person Andy Jones    schedule 10.04.2020
comment
Я знаю, что это не соответствует документации, но пробовали ли вы добавить подстановочный знак в МЕСТО: '/Time/*.txt'?   -  person Joel Cochran    schedule 13.04.2020
comment
Спасибо, @JoelCochran, но использование подстановочных знаков не помогло.   -  person Andy Jones    schedule 14.04.2020
comment
Это был долгий выстрел, но я не вижу ничего другого с места в карьер. Моя единственная другая мысль заключается в том, что, возможно, один из файлов искажен? Согласно опубликованной вами ссылке на документ: каждая строка принимаемых данных должна соответствовать определению схемы таблицы. Если строка не соответствует определению схемы, она отклоняется от загрузки. Поскольку вы указываете REJECT_VALUE = 0, разве одна ошибочная строка не приведет к возврату нулевых строк?   -  person Joel Cochran    schedule 15.04.2020
comment
Отличная идея @JoelCochran. Я попробовал ваше предложение с REJECT_VALUE = 2147483647, но все равно нулевые строки при запросе папки. Я также экспериментировал с REJECT_TYPE = процент и получил нулевые строки. Я также выполнил еще несколько тестов: - Я запросил каждый файл индивидуально (LOCATION = '/Time/time001.txt', LOCATION = '/Time/time002.txt' и т. Д.), И каждый отдельный файл в папке возвращается индивидуально. много строк с нулевыми ошибками. - Тот же набор файлов в хранилище BLOB-объектов (не ADLS Gen2) действительно возвращает много строк при запросе папки.   -  person Andy Jones    schedule 16.04.2020
comment
Вы дважды проверяли разрешения? Я хочу просто исключить это ...   -  person wBob    schedule 16.04.2020
comment
@wBob может что-то понять. Поскольку это ADLS, возможно ли, что ПОЛНОМОЧИЯ имеют доступ к файлам в папке, но не к самой папке? Хотя я бы предположил, что это сообщение об ошибке, а не 0 строк, его стоит исключить.   -  person Joel Cochran    schedule 16.04.2020
comment
Спасибо обоим. Я использую ключ учетной записи для аутентификации. Я просто экспериментировал с уровнем доступа в контейнере ADLS Gen 2, пробуя все три варианта, включая анонимный доступ на чтение для контейнеров и больших двоичных объектов). Все тесты возвращают нулевые строки.   -  person Andy Jones    schedule 16.04.2020
comment
Пора попробовать COPY INTO. Он все еще находится в стадии предварительного просмотра, но используется аналогичный подход для достижения того же результата. Это также может помочь в вашей отладке.   -  person wBob    schedule 19.04.2020


Ответы (1)


Я столкнулся с той же проблемой: проблема была в протоколе источника данных.

Скрипт с ошибкой:

   CREATE EXTERNAL DATA SOURCE datasourcename
   WITH (
       TYPE = HADOOP,
       LOCATION = 'abfss://[email protected]',
       CREDENTIAL = credential_name

Скрипт, решающий проблему:

   CREATE EXTERNAL DATA SOURCE datasourcename
   WITH (
       TYPE = HADOOP,
       LOCATION = 'abfss://[email protected]',
       CREDENTIAL = credential_name

Единственное, что нужно было изменить, это МЕСТО.

Спасибо команде поддержки Microsoft за помощь в этом.

person Renan Carvalho    schedule 19.04.2021