Azure Synapse - 增量数据加载

Posted

技术标签:

【中文标题】Azure Synapse - 增量数据加载【英文标题】:Azure Synapse - Incremental Data Load 【发布时间】:2020-12-27 06:04:34 【问题描述】:

我们使用 Azure Data Factory 将数据从本地数据库服务器加载到 Azure Data Lake Storage Gen2,然后 Databricks 将它们存储为 parquet 文件.每次运行时,我们只使用 databricks merge 语句将上次运行的新数据和修改后的数据和 UPSERT 获取到现有 parquet 文件中。

现在我们正在尝试从 parquet 文件 Azure Synapse 中移动这些数据。理想情况下,我想这样做。

将增量负载数据读入外部表。 (CETAS 或副本 进入) 将上面用作临时表。 将暂存表与生产表合并。

问题是合并语句在 Azure Syanpse 中不可用。这是 Microsoft suggests 用于增量加载的解决方案

    CREATE TABLE dbo.[DimProduct_upsert]
    WITH
    (   DISTRIBUTION = HASH([ProductKey])
    ,   CLUSTERED INDEX ([ProductKey])
    )
    AS
    -- New rows and new versions of rows
    SELECT      s.[ProductKey]
    ,           s.[EnglishProductName]
    ,           s.[Color]
    FROM      dbo.[stg_DimProduct] AS s
    UNION ALL  
    -- Keep rows that are not being touched
    SELECT      p.[ProductKey]
    ,           p.[EnglishProductName]
    ,           p.[Color]
    FROM      dbo.[DimProduct] AS p
    WHERE NOT EXISTS
    (   SELECT  *
        FROM    [dbo].[stg_DimProduct] s
        WHERE   s.[ProductKey] = p.[ProductKey]
    )
    ;
    
    RENAME OBJECT dbo.[DimProduct]          TO [DimProduct_old];
    RENAME OBJECT dbo.[DimProduct_upsert]  TO [DimProduct];

基本上使用 CTAS 删除并重新创建生产表。可以与小型维度表一起正常工作,但我担心具有数百万行索引的大型事实表。关于什么是对非常大的事实表进行增量加载的最佳方法的任何建议。谢谢!

【问题讨论】:

【参考方案1】:

在正式支持 SQL MERGE 之前,fwd 更新目标表的推荐方式是在增量记录和目标表之间使用 T SQL 插入/更新命令。

或者,您还可以使用映射数据流(在 ADF 中)模拟 SCD 事务以加载维度/事实数据。

【讨论】:

以上是关于Azure Synapse - 增量数据加载的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure Synapse 专用/无服务器 SQL 池中使用增量表

将 Azure Databricks 增量表迁移到 Azure Synapse SQL 池

将数据从 Azure SQL 数据库实时复制到 Synapse

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

我无法从数据块中的 spark 数据帧创建加载数据到 Azure Synapse (DWH)

将数据从 ADLS Gen2 加载到 Azure Synapse 时出错