代码之家  ›  专栏  ›  技术社区  ›  Gaurang Shah

配置单元:如何在不更新的情况下处理scd类型2

  •  0
  • Gaurang Shah  · 技术社区  · 4 年前

    目前,在我们的on prem Hadoop环境中,我们使用带有事务属性的配置单元表。然而,随着我们转向AWS,我们还没有这个特性。所以想了解如何在没有更新的情况下处理SCD类型2。

    以下记录。

    enter image description here

    在启用了事务属性的表中,当我获得记录的更新时,我继续并更改 end_date current date 并用 effective_date 作为 结束日期 12/31/9999 active record (其中end_date=“1999年12月31日”)。

    但是,如果我不能更新过去的记录。我有两个相同的记录 结束日期 . 如下表所示。

    我的问题是。 如果我能更新 过去的记录,

    1. 我如何得到历史上的停留时间?

    没有更新

    enter image description here

    0 回复  |  直到 4 年前
        1
  •  0
  •   leftjoin    4 年前

    'yyyy-MM-dd' 格式,所以它们都是可排序的,分析函数也可以工作。然后你可以使用 lead(effective_date, '2019-01-01') over(partition by id order by effective_date) . 对于id=1且生效日期=2019-01-01,应给出“2020-08-15”,您可以将此值指定为“2019-01-01”记录的结束日期。如果没有生效日期更大的记录,将分配“9999-01-01”。转换后的活动记录为“9999-01-01”。

    假设日期已经转换为yyyy-MM-dd,这是您可以重写表的方法(在插入之后):

    insert overwrite table your_table
    select name, id, location, effective_date,  
           lead(effective_date,'2019-01-01') over(partition by id order by effective_date) as end_date 
     from your_table
    

    或者不必先插入,您可以在子查询中将所有现有记录与新记录合并,然后计算潜在客户。

    实际上,由于配置单元中的非等连接实现,不建议SCD2用于历史数据重写。它被实现为交叉连接+过滤器(或复制连接dim.id=事实.id(这将重复行)+where事实日期(&L);=尺寸结束日期以及事实日期>=尺寸生效日期-这应该过滤一条记录)。如果由于过滤前的重复而导致维度和事实很大,则此连接非常昂贵。