Azure Synapse-增量数据加载

问题描述

我们使用 Azure Data Factory 将数据从本地数据库服务器加载到 Azure Data Lake Storage Gen2 中,而 Databricks 将它们存储为实木复合地板文件。每次运行时,我们仅使用数据块 merge 语句将上次运行的新数据和修改过的数据以及UPSERT数据获取到现有的镶木文件中。

现在,我们正在尝试从实木复合地板文件 Azure Synapse 中移动此数据。理想情况下,我想这样做。

  • 将增量加载数据读取到外部表中。 (CETAS或copY INTO)
  • 在上方用作登台表。
  • 将登台表与生产表合并。

问题是Azure Syanpse中没有merge语句。这是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基本删除并重新创建生产表。可以使用较小的维表很好地工作,但是我对具有数以百万计的带有索引的行的100个大型事实表感到不安。任何建议对于大型事实表进行增量加载的最佳方法是什么。谢谢!

解决方法

直到正式支持SQL MERGE为止,建议的更新目标表的方法是在增量记录和目标表之间使用T SQL插入/更新命令。

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