【发布时间】: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 删除并重新创建生产表。可以与小型维度表一起正常工作,但我担心具有数百万行索引的大型事实表。关于什么是对非常大的事实表进行增量加载的最佳方法的任何建议。谢谢!
【问题讨论】:
标签: azure azure-sql-database azure-data-factory-2 azure-sql-data-warehouse azure-synapse