1

目前在我们的本地 Hadoop 环境中,我们正在使用具有事务属性的配置单元表。但是,随着我们迁移到 AWS,我们还没有该功能。所以想了解如何在不更新的情况下处理 SCD 类型 2。

例如。用于以下记录。

有更新

在此处输入图像描述

在启用事务属性的表中,当我获得记录的更新时,我继续更改end_dateto并使用as和ascurrent date创建新记录,如上表所示。因此更容易找到我的(其中 end_date = "12/31/9999")。effective_datecurrent dateend_date12/31/9999active record

但是,如果我不能更新过去的记录。我有两条相同的记录end_date。如下表所示。

我的问题是。 如果我可以更新end_date过去的记录,

  1. 如何获取历史停留时间?
  2. 我如何获得活动记录?

没有更新

在此处输入图像描述

4

1 回答 1

0

首先,将所有日期转换为'yyyy-MM-dd'格式,这样它们都将是可排序的并且分析功能将起作用。然后你可以使用lead(effective_date, '2019-01-01') over(partition by id order by effective_date). 对于 id=1 和 effective_date = 2019-01-01,它应该为您提供“2020-08-15”,您可以将此值指定为“2019-01-01”记录的 end_date。如果没有更大有效日期的记录,则分配“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

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

实际上,由于 Hive 中的非 equi join 实现,不建议将 SCD2 用于历史数据重写。它被实现为交叉连接 + 过滤器(或在 dim.id=fact.id 上复制连接(这将重复行)+ where fact.date<=dim.end_date 和 fact.date>=dim.effective_date - 这应该过滤一个记录)。如果维度和事实因过滤前的重复而很大,则此连接非常昂贵。

于 2020-08-17T10:13:28.927 回答