Загрузка данных из ADLS Gen 2 в Azure Synapse

Я пытаюсь загрузить файлы Parquet из ADLS Gen2 в Synapse, используя функцию внешней таблицы polybase.

Ниже приведен код, но при запуске команды создания внешней таблицы запрос никогда не завершается. При отмене выполнения запроса я вижу эту ошибку -

Не удалось получить доступ к внешнему файлу из-за внутренней ошибки: «Произошла ошибка при доступе к HDFS: исключение Java возникло при вызове HdfsBridge_IsDirExist. Сообщение об исключении Java: HdfsBridge :: isDirExist - Произошла непредвиденная ошибка при проверке наличия каталога: UnknownHostException: '' .azuredatalakestore.dfs.core.windows.net '

SQL-запрос

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

DROP CREDENTIAL ADLSCredential
CREATE DATABASE SCOPED CREDENTIAL ADLSCredential
WITH
    IDENTITY = 'user',
    SECRET = '<secret-key>'
;

CREATE EXTERNAL DATA SOURCE AzureDataLakeStorage
WITH (
    TYPE = HADOOP,
    LOCATION = 'abfss://<container>@<storage-account>.azuredatalakestore.dfs.core.windows.net',
    CREDENTIAL = ADLSCredential
);

-- Create an external file format for PARQUET files.  
CREATE EXTERNAL FILE FORMAT parquet  
WITH (  
    FORMAT_TYPE = PARQUET,  
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'  
); 

CREATE EXTERNAL FILE FORMAT uncompressedcsv
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS (
        FIELD_TERMINATOR = ',',
        STRING_DELIMITER = '',
        DATE_FORMAT = '',
        USE_TYPE_DEFAULT = False
    )
);

CREATE EXTERNAL TABLE [dbo].[CashReceipts_external] (
    [AMOUNT_APPLIED] [float] NOT NULL,
    [TRX_NUMBER] [nvarchar](50) NULL,
    [SHORT_NAME] [nvarchar](50) NOT NULL,
    [NAME] [nvarchar](1) NULL,
    [CURRENT_RECORD_FLAG] [nvarchar](50) NULL,
    [CURRENCY_CODE] [nvarchar](50) NULL,
    [FUNC_CURRENCY_CODE] [nvarchar](50) NOT NULL,
    [CASH_RCPT_AMOUNT] [float] NULL,
    [CASH_HISTORY_AMOUNT] [float] NULL,
    [FUNC_AMT_HISTORY] [float] NULL,
    [STATUS] [nvarchar](50) NULL,
    [ANTICIPATED_CLEARING_DATE] [nvarchar](50) NULL,
    [CASH_HISTORY_EXCHANGE_RATE] [nvarchar](50) NULL,
    [GL_DATE] [datetime2](7) NULL,
    [GL_PERIOD] [datetime2](7) NOT NULL,
    [BATCH_GL_DATE] [nvarchar](1) NULL,
    [EXCHANGE_RATE] [nvarchar](50) NULL,
    [RECEIPT_NUMBER] [nvarchar](50) NULL,
    [DEPOSIT_DATE] [datetime2](7) NULL,
    [RECEIPT_DATE] [datetime2](7) NULL,
    [ISSUE_DATE] [nvarchar](1) NULL,
    [TYPE] [nvarchar](50) NULL,
    [GL_POSTED_DATE] [datetime2](7) NULL,
    [AMOUNT] [float] NULL
)
WITH
(
    LOCATION='parquetfiles'
,   DATA_SOURCE = AzureDataLakeStorage
,   FILE_FORMAT = parquet
,   REJECT_TYPE = VALUE
,   REJECT_VALUE = 0
)
;

person shankar gopinath    schedule 13.05.2020    source источник
comment
Проведите строки одну за другой и посмотрите, где он застрял. Или он застревает в строке, где вы фактически импортируете его в локальную таблицу? Пожалуйста, опубликуйте и это   -  person Nick.McDermaid    schedule 13.05.2020
comment
Конечно! только команда создания внешней таблицы не работает   -  person shankar gopinath    schedule 13.05.2020
comment
Я думаю, это может быть проблема с разрешениями. Пожалуйста, проверьте правильность введенных вами учетных данных ADLS   -  person Venkataraman R    schedule 14.05.2020


Ответы (2)


Согласно сообщению об ошибке, ошибка вызвана расположением "parquetfiles".

Пожалуйста, попробуйте следующую команду CREATE EXTERNAL DATA SOURCE:

CREATE EXTERNAL DATA SOURCE AzureDataLakeStorage
WITH
  ( LOCATION = 'wasbs://<container>@<storage_account>.blob.core.windows.net' ,
    CREDENTIAL = AzureStorageCredential ,
    TYPE = BLOB_STORAGE
  ) ;

Когда CREATE EXTERNAL TABLE, используйте имя файла или папки:

CREATE EXTERNAL TABLE [dbo].[CashReceipts_external] (
    [AMOUNT_APPLIED] [float] NOT NULL,
    [TRX_NUMBER] [nvarchar](50) NULL,
    [SHORT_NAME] [nvarchar](50) NOT NULL,
    [NAME] [nvarchar](1) NULL,
    [CURRENT_RECORD_FLAG] [nvarchar](50) NULL,
    [CURRENCY_CODE] [nvarchar](50) NULL,
    [FUNC_CURRENCY_CODE] [nvarchar](50) NOT NULL,
    [CASH_RCPT_AMOUNT] [float] NULL,
    [CASH_HISTORY_AMOUNT] [float] NULL,
    [FUNC_AMT_HISTORY] [float] NULL,
    [STATUS] [nvarchar](50) NULL,
    [ANTICIPATED_CLEARING_DATE] [nvarchar](50) NULL,
    [CASH_HISTORY_EXCHANGE_RATE] [nvarchar](50) NULL,
    [GL_DATE] [datetime2](7) NULL,
    [GL_PERIOD] [datetime2](7) NOT NULL,
    [BATCH_GL_DATE] [nvarchar](1) NULL,
    [EXCHANGE_RATE] [nvarchar](50) NULL,
    [RECEIPT_NUMBER] [nvarchar](50) NULL,
    [DEPOSIT_DATE] [datetime2](7) NULL,
    [RECEIPT_DATE] [datetime2](7) NULL,
    [ISSUE_DATE] [nvarchar](1) NULL,
    [TYPE] [nvarchar](50) NULL,
    [GL_POSTED_DATE] [datetime2](7) NULL,
    [AMOUNT] [float] NULL
)
WITH
(
    LOCATION='[filename]'
,   DATA_SOURCE = AzureDataLakeStorage
,   FILE_FORMAT = parquet
,   REJECT_TYPE = VALUE
,   REJECT_VALUE = 0
)
;

Ссылка:

  1. Создать внешний источник данных для ссылки на хранилище BLOB-объектов Azure
  2. Создать внешнюю таблицу: Аргументы:

LOCATION = 'folder_or_filepath' Указывает папку или путь к файлу и имя файла для фактических данных в хранилище BLOB-объектов Hadoop или Azure.

Если вы укажете LOCATION как папку, запрос PolyBase, который выбирает из внешней таблицы, будет извлекать файлы из папки и всех ее подпапок. Как и Hadoop, PolyBase не возвращает скрытые папки. Он также не возвращает файлы, имя которых начинается с подчеркивания (_) или точки (.).

В этом примере, если LOCATION = '/ webdata /', запрос PolyBase вернет строки из mydata.txt и mydata2.txt. Он не вернет mydata3.txt, потому что это файл в скрытой папке. И он не вернет _hidden.txt, потому что это скрытый файл.

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

Надеюсь это поможет.

person Leon Yue    schedule 14.05.2020
comment
Он столкнулся с проблемой с хранилищем ADLS gen2. Ваше предложение касается хранилища BLOB-объектов Azure. - person Venkataraman R; 14.05.2020

Команда "Создать внешний источник данных" имеет расположение атрибута

LOCATION = 'abfss://<container>@<storage-account>.azuredatalakestore.dfs.core.windows.net'

Это должно было быть

LOCATION = 'abfss://<container>@<storage-account>.dfs.core.windows.net'

Я перепутал это с атрибутом местоположения ADLS Gen 1. Мое плохое. Спасибо всем, что нашли время разобраться в этом. Пометить это как закрытое. В итоге я использовал регистрационный токен приложения AAD вместо ключа хранилища.

person shankar gopinath    schedule 14.05.2020