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

Posted

技术标签:

【中文标题】蜂巢:如何在不更新的情况下处理 scd 类型 2【英文标题】:hive: how to handle scd type 2 without update 【发布时间】:2020-08-15 22:22:26 【问题描述】:

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

例如。 供后续记录。

有更新

在启用事务属性的表中,当我获得记录更新时,我继续将 end_date 更改为 current date 并使用 effective_date 创建新记录作为 current dateend_date 作为 @ 987654330@,如上表所示。因此更容易找到我的active record(其中 end_date = "12/31/9999")。

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

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

    如何获取历史停留时长? 如何获得活动记录?

没有更新

【问题讨论】:

基本上你需要重写整个表格。 【参考方案1】:

首先,将所有日期转换为'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 中的 non-equi join 实现,不建议使用 SCD2 进行历史数据重写。它被实现为交叉连接 + 过滤器(或在 dim.id=fact.id 上复制连接(这将重复行)+ where fact.date=dim.effective_date - 这应该过滤一个记录)。如果维度和事实都很大,因为过滤前的重复,这种连接是非常昂贵的。

【讨论】:

不会在巨大的表上插入覆盖,这是一个性能问题。如果不推荐使用 scd 类型 2,人们如何维护其维度记录的历史记录? @GaurangShah 通常他们不维护 SCD2。 1. 使用所有维度属性保持表格非规范化。 2. 使用 SCD1。覆盖维度并不是 Hive 中可能发生的最大问题。大事实与大维度的连接是一个更大的性能问题。 Non-equi-join 是一个更大的问题

以上是关于蜂巢:如何在不更新的情况下处理 scd 类型 2的主要内容,如果未能解决你的问题,请参考以下文章

如何在不覆盖当前数据的情况下更新 Mongoose 中的混合类型字段?

如何处理 SCD 类型 2 维度和重复维度记录?

如何在不使用唯一修饰符的情况下通过灵活的搜索更新项目类型的所有实例?

PyQt:如何在不冻结 GUI 的情况下更新进度?

如何在不影响性能的情况下抽象 SIMD 代码以处理不同的数据类型

我们如何在不使用泛型类型进行自定义的情况下处理身份核心用户管理和用户存储的多个用户使用情况?