将 ADLS Gen 2 中的数据加载到 Azure Synapse

Posted

技术标签:

【中文标题】将 ADLS Gen 2 中的数据加载到 Azure Synapse【英文标题】:Loading data from ADLS Gen 2 into Azure Synapse 【发布时间】:2020-08-29 15:15:54 【问题描述】:

我正在尝试使用 polybase 外部表功能将 Parquet 文件从 ADLS Gen2 加载到 Synapse。

下面是代码,但是在运行 create external table 命令时,查询永远不会完成。在取消查询执行时,我看到了这个错误 -

由于内部错误,外部文件访问失败:'访问 HDFS 时发生错误:调用 HdfsBridge_IsDirExist 时引发 Java 异常。 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
)
;

【问题讨论】:

一行一行地运行,看看卡在哪里。或者它是否卡在您实际将其导入本地表的行上?也请张贴那个 当然!只有创建外部表命令失败 我认为可能是权限问题。请查看您提供的ADLS凭证是否正确 【参考方案1】:

根据错误信息,错误是由位置“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
)
;

参考:

    Create external data source to reference Azure blob storage Create external table: Arguments:

LOCATION = 'folder_or_filepath' 指定 Hadoop 或 Azure Blob 存储中实际数据的文件夹或文件路径和文件名。

如果您将 LOCATION 指定为文件夹,则从外部表中选择的 PolyBase 查询将从文件夹及其所有子文件夹中检索文件。与 Hadoop 一样,PolyBase 不返回隐藏文件夹。它也不返回文件名以下划线 (_) 或句点 (.) 开头的文件。

在此示例中,如果 LOCATION='/webdata/',PolyBase 查询将返回来自 mydata.txt 和 mydata2.txt 的行。它不会返回 mydata3.txt 因为它是隐藏文件夹中的文件。而且它不会返回 _hidden.txt,因为它是一个隐藏文件。

请注意:一个文件一个表,我们可以加载多个文件来创建外部表!

希望这会有所帮助。

【讨论】:

他正面临 ADLS gen2 存储的问题。您的建议是针对 Azure blob 存储。【参考方案2】:

创建外部数据源命令有一个属性位置

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

应该是的

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

我把它与 ADLS Gen 1 Location 属性混淆了。我的错。感谢大家花时间研究这个。将其标记为已关闭。我最终使用了 AAD 应用注册令牌而不是存储密钥。

【讨论】:

以上是关于将 ADLS Gen 2 中的数据加载到 Azure Synapse的主要内容,如果未能解决你的问题,请参考以下文章

我们如何修复 ADLS Gen 2 中的增量位置文件

DataBricks - 将更改保存回 DataLake (ADLS Gen2)

使用 Python 或 Java 从本地将数据上传到 Azure ADLS Gen2

如何使用 Azure databricks 通过 ADLS gen 2 中的多个工作表读取和写入 excel 数据

如何将 AMLS 连接到 ADLS Gen 2?

使用 Databricks 将文件从 Azure 文件移动到 ADLS Gen 2 并返回