在Azure Data Factory (ADF) 中实现缓慢变化维度(SCD)的三种类型

通过这些设计,可在ADF中高效实现SCD类型1/2/3,满足历史跟踪与实时分析需求。

类型1:覆盖旧值(Overwrite Old Value)

设计实现

  1. 目标表结构

    • 仅包含维度当前状态,无历史记录字段(如 CustomerID, Name, Address)。
    • 主键为自然键(如 CustomerID)。
  2. ADF实现步骤

    • 活动1:Lookup Activity
      从目标维度表中查询现有数据(如 SELECT CustomerID, Address FROM Customer)。
    • 活动2:Data Flow
      • Source: 连接源数据(如更新的客户地址)。
      • Join: 将源数据与目标表数据按自然键(CustomerID)左连接。
      • Condition: 筛选出源与目标中地址不同的记录。
      • Sink: 使用ALTER Row策略直接更新目标表中的地址字段。
    • 活动3:Stored Procedure Activity(可选)
      调用存储过程清理临时表或记录日志。
  3. 关键配置

    • 数据流中的Update策略需设置为Allow update,并在Sink设置中启用更新操作。

类型2:创建新记录(Create New Record)

设计实现

  1. 目标表结构

    • 新增代理键(SurrogateKey)、StartDateEndDateIsCurrent(布尔值)。
    • 示例字段:SurrogateKey, CustomerID, Address, StartDate, EndDate, IsCurrent
  2. 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: 更新旧记录的EndDateIsCurrent字段。
    • 活动3:Execute Pipeline(可选)
      调用子管道处理历史数据归档。
  3. 关键配置

    • 使用Surrogate Key生成器(如数据库自增或哈希值)。
    • 在Sink中启用插入和更新操作,通过ALTER Row策略区分动作。

类型3:添加有效日期(Add Valid Dates)

设计实现

  1. 目标表结构

    • 包含StartDateEndDate,无代理键(依赖自然键+时间范围)。
    • 示例字段:CustomerID, Address, StartDate, EndDate
  2. 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
  3. 关键配置

    • 使用Window Transformation生成时间范围。
    • 在Sink中设置更新条件(如CustomerID = old.CustomerID AND EndDate IS NULL)。

测试用例

通用测试场景

  1. 初始数据加载
    • 验证空表是否能正确插入初始记录。
  2. 无变化数据
    • 源数据与目标一致时,确保无冗余操作。
  3. 数据冲突
    • 测试并发更新时的锁机制或错误处理。

类型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
    • 预期:时间范围连续无重叠,旧记录失效。

优化建议

  1. 增量加载
    • 使用Change TrackingWatermark减少全量扫描。
  2. 性能调优
    • 分区处理大表,优化Join性能。
  3. 错误处理
    • 配置重试策略和失败通知(如Azure Logic Apps/Email)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值