文档章节

缓慢变化维(SCD)处理方式

 张欢19933
发布于 2016/09/12 16:34
字数 1030
阅读 275
收藏 1

维度可以根据变化剧烈程度主要分为无变化维度、缓慢变化维度和剧烈变化维度。例如一个人的相关信息,身份证号、姓名和性别等信息数据属于不变的部分,政治面貌和婚姻状态属于缓慢变化部分,而工作经历、工作单位和培训经历等在某种程度上属于急剧变化字段。

对于剧烈变化维度,通常情况下都是一分为二进行处理的,把其中不常变动的部分单独抽出来作为一个维表,按照缓慢变化维方式进行处理;另外一部分也单独抽取出来,通常作为维度的属性进行处理。

大多数维度表随时间的迁移是缓慢变化的。比如增加了新的产品,或者产品的ID号码修改了,或者产品增加了一个新的属性,此时,维度表就会被修改或者增加新的记录行。这样,在设计维度和使用维度的过程中,就要考虑到缓慢变化维度的处理。

缓慢渐变维,即维度中的属性可能会随着时间发生改变,比如包含用户住址Address的DimCustomer维度,用户的住址可能会发生改变,进而影响业务统计精度,DimCustomer维度就是缓慢渐变维(SCD),对于SCD,处理方式通常有以下几种:

Type 1:完全不记录历史变化信息,在ETL将数据载入SCD的时候,对于会产生变化的属性值直接覆盖,比如对于DimCustomer的Address,每次都会将新的地址update到该字段,因此这个SCD实际上总是最新的当前信息,却没能包含历史信息

更新前:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position
    101212                   12345             Jack         Developer

    更新后:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position
    101212                   12345             Jack          Manager

Type 2:通过添加记录来将每一次变化都记录到SCD中,每条记录都有两个字段(如Effective_start和Effective_end)表明该记录的有效期间,并且可以设定一个Active标志位字段,当该字段为True的时候表明这条记录是最新的状态,为False的时候表明该记录是历史记录,其有效期间可以通过Effective_start和Effective_end字段来查

更新前:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position   start_date   end_date
    101212                 12345             Jack            Developer  2010-2-5    2012-6-12

    更新后:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position   start_date   end_date
    201245                 12345             Jack            Manager     2012-6-12

Type 3:通过对会发生变化的字段,添加相应的历史字段,来记录最近的变化而非全部变化。比如DimCustomer中有两个字段Address和Address_Old,第一个字段是用户的当前住址,后一个字段是用户之前一次的住址,显然,更久之前的信息就无法追溯了

更新前:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position   old_position   
    101212                 12345             Jack               Developer  null

    更新后:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position   old_position
    101212                 12345             Jack               Manager     Developer

Type 4:除了一个记录当前信息的维度外,单独建立一个历史信息维度,该维度中需要包含有效期间字段(如Effective_start和Effective_end)

Type 5:可以看到,对于Type 1/2/3,都是对于SCD中渐变属性的处理方式,而针对一个包含多字段的复杂的SCD,可能需要结合以上三种处理方式。比如对于DimCustomer中的用户联系方式属性email,如果业务上并不重要,那么这个字段可以采取Type 1的方式,即每次只保留最新的联络方式,覆盖原来的;假如业务中需要分析用户所在地Region,那么很可能需要用到Type 2,记录每一个Region的改变;而对于地址信息Address,可能并不需要追溯很久的变化,那么加一个Address_Old字段来记录上一次的住址就够了

© 著作权归作者所有

粉丝 46
博文 538
码字总数 247200
作品 0
海淀
私信 提问
使用BO DI处理 SCD2维表

摘要:本文首先介绍了缓慢变化维的定义、三种处理方式。之后以员工维表数据为例,详细说明如何使用BO DI实现SCD2维表的ETL。最后讲解了SCD2维表如何使用。 1 缓慢变化维简介 某些维度的属性会...

永和
2014/04/13
170
0
HAWQ取代传统数仓实践(三)——初始ETL(Sqoop、HAWQ)

一、用sqoop用户建立初始抽取脚本 本示例要用Sqoop将MySQL的数据抽取到HDFS上的指定目录,然后利用HAWQ外部表功能将HDFS数据文件装载到内部表中。表1汇总了示例中维度表和事实表用到的源数据...

wzy0623
2017/05/12
0
0
维度处理-数据仓库-读书笔记(四)

数据仓库中如何使用一致性维度集成 一致性维度 1,当不同的维度表的属性具有相同的列名和领域内容时候,称为维度具有一致性 2,有利于不同事实表的合并到同一报表中去 3,在一致性维度的前提...

数据僧
2018/08/22
0
0
基于Hadoop生态圈的数据仓库实践 —— ETL(二)

二、使用Hive转换、装载数据 1. Hive简介 (1)Hive是什么 Hive是一个数据仓库软件,使用SQL读、写、管理分布式存储上的大数据集。它建立在Hadoop之上,具有以下功能和特点: 通过SQL方便地访...

wzy0623
2016/07/06
0
0
关于本博客数据仓库方面的原创文章汇总

关于本博客数据仓库方面的原创文章汇总 收藏 关于数据仓库方面的文章汇总 我的数据仓库之路! 关于数据仓库维度处理的系列文章 1 关于数据仓库维度数据处理的方法探究系列—— 维的概述 2 关...

baoqiangwang
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

c++ 虚基类

c++ 虚基类 p556

天王盖地虎626
24分钟前
27
0
Java中的面向对象

一、面向对象 面向对象和面向过程的区别 过程就是函数,就是写方法,就是方法的一种实现。 对象就是将函数,属性的一种封装。用人们思考习惯的方式思考问题。 如何自定义类 修饰符 类名{ //成...

zhiruochujian
32分钟前
3
0
k8s删除Terminating状态的命名空间

背景: 我们都知道在k8s中namespace有两种常见的状态,即Active和Terminating状态,其中后者一般会比较少见,只有当对应的命名空间下还存在运行的资源,但是该命名空间被删除时才会出现所谓的...

Andy-xu
35分钟前
25
0
seata源码阅读笔记

seata源码阅读笔记 本文没有seata的使用方法,怎么使用seata可以参考官方示例,详细的很。 本文基于v0.8.0版本,本文没贴代码。 seata中的三个重要部分: TC:事务协调器,维护全局事务和分支...

东都大狼狗
48分钟前
20
0
Rust:最小化窗口后 CPU占用率高 (winit,glutin,imgui-rust)

最近试着用 imgui-rust 绘制界面,发现窗口最小化后CPU占用会增大。 查询的资料如下: https://github.com/rust-windowing/winit/issues/783 https://github.com/ocornut/imgui/issues/1151 ...

reter
52分钟前
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部