通过这些设计,可在ADF中高效实现SCD类型1/2/3,满足历史跟踪与实时分析需求。
类型1:覆盖旧值(Overwrite Old Value)
设计实现
-
目标表结构
- 仅包含维度当前状态,无历史记录字段(如
CustomerID
,Name
,Address
)。 - 主键为自然键(如
CustomerID
)。
- 仅包含维度当前状态,无历史记录字段(如
-
ADF实现步骤
- 活动1:Lookup Activity
从目标维度表中查询现有数据(如SELECT CustomerID, Address FROM Customer
)。 - 活动2:Data Flow
- Source: 连接源数据(如更新的客户地址)。
- Join: 将源数据与目标表数据按自然键(
CustomerID
)左连接。 - Condition: 筛选出源与目标中地址不同的记录。
- Sink: 使用
ALTER Row
策略直接更新目标表中的地址字段。
- 活动3:Stored Procedure Activity(可选)
调用存储过程清理临时表或记录日志。
- 活动1:Lookup Activity
-
关键配置
- 数据流中的
Update
策略需设置为Allow update
,并在Sink设置中启用更新操作。
- 数据流中的
类型2:创建新记录(Create New Record)
设计实现
-
目标表结构
- 新增代理键(
SurrogateKey
)、StartDate
、EndDate
、IsCurrent
(布尔值)。 - 示例字段:
SurrogateKey, CustomerID, Address, StartDate, EndDate, IsCurrent
。
- 新增代理键(
-
ADF实现步骤
- 活动1:Lookup Activity
查询目标表中当前有效记录(WHERE IsCurrent = 1
)。 - 活动2:Data Flow
- Source: 源数据(如新地址)。
- Join: 按自然键(
CustomerID
)连接源与目标表。 - Derived Column: 添加新字段:
StartDate = currentTimestamp()
EndDate = null
IsCurrent = true
- Condition Split:
- Case1:源与目标地址不同 → 生成新记录并标记旧记录为失效。
- Case2:地址相同 → 忽略。
- Sink1: 插入新记录(新代理键)到目标表。
- Sink2: 更新旧记录的
EndDate
和IsCurrent
字段。
- 活动3:Execute Pipeline(可选)
调用子管道处理历史数据归档。
- 活动1:Lookup Activity
-
关键配置
- 使用
Surrogate Key
生成器(如数据库自增或哈希值)。 - 在Sink中启用插入和更新操作,通过
ALTER Row
策略区分动作。
- 使用
类型3:添加有效日期(Add Valid Dates)
设计实现
-
目标表结构
- 包含
StartDate
、EndDate
,无代理键(依赖自然键+时间范围)。 - 示例字段:
CustomerID, Address, StartDate, EndDate
。
- 包含
-
ADF实现步骤
- 活动1:Lookup Activity
查询目标表中当前有效记录(WHERE EndDate IS NULL
)。 - 活动2:Data Flow
- Source: 源数据(如新地址)。
- Join: 按自然键(
CustomerID
)连接源与目标表。 - Derived Column:
- 新记录:
StartDate = currentDate()
,EndDate = null
- 旧记录:
EndDate = currentDate()
- 新记录:
- Union: 合并新旧记录。
- Sink: 插入新记录并更新旧记录的
EndDate
。
- 活动1:Lookup Activity
-
关键配置
- 使用
Window Transformation
生成时间范围。 - 在Sink中设置更新条件(如
CustomerID = old.CustomerID AND EndDate IS NULL
)。
- 使用
测试用例
通用测试场景
- 初始数据加载
- 验证空表是否能正确插入初始记录。
- 无变化数据
- 源数据与目标一致时,确保无冗余操作。
- 数据冲突
- 测试并发更新时的锁机制或错误处理。
类型1测试用例
- 用例1:更新客户地址
- 输入:
CustomerID=1001, Address=New York → Tokyo
- 预期:目标表中仅保留
Tokyo
,旧地址被覆盖。
- 输入:
类型2测试用例
- 用例1:新增地址版本
- 输入:
CustomerID=1001, Address=London
- 预期:
- 旧记录
IsCurrent=0
,EndDate=2023-10-01
- 新记录
IsCurrent=1
,StartDate=2023-10-02
,EndDate=NULL
- 旧记录
- 输入:
类型3测试用例
- 用例1:时间范围重叠
- 输入:插入
StartDate=2023-10-01
的新记录,旧记录EndDate=2023-09-30
- 预期:时间范围连续无重叠,旧记录失效。
- 输入:插入
优化建议
- 增量加载
- 使用
Change Tracking
或Watermark
减少全量扫描。
- 使用
- 性能调优
- 分区处理大表,优化Join性能。
- 错误处理
- 配置重试策略和失败通知(如Azure Logic Apps/Email)。