问题描述
我们使用 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事务以进行维度/事实数据加载。