hive:如何在不更新的情况下处理scd类型2

kdfy810k  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(436)

目前在我们的on-prem hadoop环境中,我们使用具有事务属性的配置单元表。然而,随着我们转向aws,我们还没有这个功能。所以我想了解如何在不更新的情况下处理scd类型2。
例如。作如下记录。
有更新

在启用了事务属性的表中,当我得到一个记录的更新时,我继续并更改 end_datecurrent date 并用 effective_date 作为 current date 以及 end_date 作为 12/31/9999 ,如上表所示。所以更容易找到我的 active record (其中结束日期=“12/31/9999”)。
但是,如果我不能更新过去的记录。我有两张同样的唱片 end_date . 如下表所示。
我的问题是。如果我能更新 end_date 过去的记录,
如何获得历史停留时间?
如何获取活动记录?
无更新

djp7away

djp7away1#

首先,将所有日期转换为 '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

或者不先执行insert,就可以在子查询中将所有现有记录与新记录合并,然后计算lead。
实际上,scd2不建议用于历史数据重写,因为在hive中实现了非equi-join。它实现为交叉联接+筛选(或在dim.id=fact.id上复制联接(这将复制行)+其中fact.date<=dim.end\u date和fact.date>=dim.effective\u date-这应该筛选一条记录)。如果维度和事实因为过滤前的重复而很大,那么这种连接是非常昂贵的。

相关问题