数仓之缓慢变化维(拉链表)

2024-03-04 01:50
文章标签 变化 缓慢 数仓 拉链

本文主要是介绍数仓之缓慢变化维(拉链表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 缓慢变化维
      • 拉链表 -- 理论
        • 缓慢变化维解决方案:
        • 拉链表场景:
        • 拉链表缺点:
        • 拉链表查询优化:
      • 拉链表 -- 示例
        • sql
        • 查询方式
      • 补充
        • 流水表
        • 全量表
        • 增量表

缓慢变化维

  1. 什么是缓慢变化维?
    缓慢变化维,简称SCD(Slowly Changing Dimensions)
    一些维度表的数据不是静态的,而是会随着时间而缓慢地变化(这里的缓慢是相对事实表而言,事实表数据变化的速度比维度表快)这种随着时间发生变化的维度称之为缓慢变化维,把处理维度表数据历史变化的问题为缓慢变化维问题,简称SCD问题。
    具体可参考:https://cloud.tencent.com/developer/article/1780529

拉链表 – 理论

缓慢变化维解决方案:
  • SCD解决方案 - 保留原始值
    某一个属性值绝不会变化。事实表始终按照该原始值进行分组。例如:
    出生日期的数据,始终按照用户第一次填写的数据为准。

  • SCD解决方案 - 改写属性值
    对其相应需要重写维度行中的旧值,以当前值替换。因此其始终反映最近的情况。
    当一个维度值的数据源发生变化,并且不需要在维度表中保留变化历史时,通常用新数据来覆盖旧数据。这样的处理使属性所反映的中是最新的赋值。

  • SCD解决方案 - 增加维度新行
    数据仓库系统的目标之一是正确地表示历史。典型代表就是拉链表。
    保留历史的数据,并插入新的数据。例如: 用户维度表

拉链表场景:

储存空间大
字段变更:上亿数据量,部分字段更新 (用户的地址,产品的描述信息,品牌信息等等;)
查询历史状态(病毒第一次出现日期,最后一次出现日期)
统计历史行为次数

拉链表缺点:

join消耗资源
不容易维护,如果有一天数据错误从这天到现在的数据都要重新跑
查询性能低,存放N年数据,表数据量很大影响性能

拉链表查询优化:

拉链表当然也会遇到查询性能的问题,比如说我们存放了5年的拉链数据,那么这张表势必会比较大,
当查询的时候性能就比较低了,个人认为两个思路来解决:

1.在一些查询引擎中,我们对start_date和end_date做索引,这样能提高不少性能。
2.保留部分历史数据,比如说我们一张表里面存放全量的拉链表数据,然后再对外暴露一张只提供近3个月数据的拉链表。
3. 查询检索性能没有明显提高,但可以将start_dt和end_dt当成分区字段,已提高检索性能;

拉链表 – 示例

sql

测试数据:

ods
('001', '待审核', '2019-12-18', '2019-12-20'),
('002', '待售', '2019-12-19', '2019-12-20'),
('003', '在售', '2019-12-20', '2019-12-20'),
('004', '已删除', '2019-12-15', '2019-12-20'),
('001', '待售', '2019-12-18', '2019-12-21'),
('005', '待审核', '2019-12-21', '2019-12-21'),
('006', '待审核', '2019-12-21', '2019-12-21');dwd
('001', '待审核', '2019-12-18', '2019-12-20'),
('002', '待售', '2019-12-19', '2019-12-20'),
('003', '在售', '2019-12-20', '2019-12-20'),
('004', '已删除', '2019-12-15', '2019-12-20')

ods表:

-- 创建ods层表
create table if not exists ods_product_2(goods_id string,        -- 商品编号goods_status string,    -- 商品状态createtime string,      -- 商品创建时间modifytime string       -- 商品修改时间
)
partitioned by (dt string)
row format delimited fields terminated by ',' stored as TEXTFILE;

dw表:

-- dw层 创建拉链表
create table if not exists dw_product_2(goods_id string,        -- 商品编号goods_status string,    -- 商品状态createtime string,      -- 商品创建时间modifytime string,       -- 商品修改时间dw_start_date string,   -- 生效日期dw_end_date string      -- 失效日期
)
row format delimited fields terminated by ',' stored as TEXTFILE;

拉链逻辑:

在原有dw层表上,添加额外的两列
生效日期(dw_start_date)
失效日期(dw_end_date)
只同步当天修改的数据到ods层

拉链表算法实现
编写SQL处理当天最新的数据(新添加的数据和修改过的数据)
编写SQL处理dw层历史数据,重新计算之前的dw_end_date
拉链表的数据为:当天最新的数据 UNION ALL 历史数据

-- ods 21日新增数据 拉链 dwd 20日数据
SELECTt1.goods_id,t1.goods_status,t1.createtime,t1.modifytime,t1.dw_start_date,CASE WHEN (t2.goods_id IS NOT NULL AND t1.dw_end_date > '2019-12-21') THEN '2019-12-21' --这里保证只修改最新的那条数据ELSE t1.dw_end_dateEND AS dw_end_date
FROM dw_product_2 t1
LEFT JOIN (SELECT * FROM ods_product_2 WHERE dt='2019-12-21') t2 -- ods昨天数据和今天的dw数据关联,只有修改的
ON t1.goods_id = t2.goods_id
union ALL
selectgoods_id,                -- 商品编号goods_status,            -- 商品状态createtime,              -- 商品创建时间modifytime,              -- 商品修改时间modifytime as dw_start_date,  -- 生效日期'9999-12-31' as dw_end_date   -- 失效日期
fromods_product_2 where dt='2019-12-21'    -- 只有新增和修改的数据
order by dw_start_date, goods_id;

在这里插入图片描述

查询方式
-- 获取2019-12-20日的历史快照数据
SELECT * FROM dw_product_2 WHERE dw_start_date<='2019-12-20' AND dw_end_date>'2019-12-20';
-- 获取最新的商品快照数据
SELECT * FROM dw_product_2 WHERE dw_end_date = '9999-12-31';

在这里插入图片描述

补充

流水表

流水表存放的是一个用户的变更记录,比如在一张流水表中,一天的数据中,会存放一个用户的每条修改记录,但是在拉链表中只有一条记录。
这是拉链表设计时需要注意的一个粒度问题。我们当然也可以设置的粒度更小一些,一般按天就足够。

全量表

每天的所有的最新状态的数据。
(1)全量表,有无变化,都要报
(2)每次上报的数据都是所有的数据(变化的 + 没有变化的)

增量表

新增数据,增量数据是上次导出之后的新数据。
(1)记录每次增加的量,而不是总量;
(2)流量是指在一定时间内的增量;
(3)流量一般设计成增量表(日报-常用、月报);
(4)流量和存量的区别:流量是增量;存量是总量;
(5)增量表,只报变化量,无变化不用报

在这里插入图片描述

这篇关于数仓之缓慢变化维(拉链表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/771651

相关文章

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

如何评价Ubuntu 24.04 LTS? Ubuntu 24.04 LTS新功能亮点和重要变化

《如何评价Ubuntu24.04LTS?Ubuntu24.04LTS新功能亮点和重要变化》Ubuntu24.04LTS即将发布,带来一系列提升用户体验的显著功能,本文深入探讨了该版本的亮... Ubuntu 24.04 LTS,代号 Noble NumBAT,正式发布下载!如果你在使用 Ubuntu 23.

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

c++的静态变化!

静态成员   对于非静态成员,一个类的每个对象都自己存有一个副本,每个对象根据自己拥有的非静态的数据成员来区别于其他对象。而静态成员则解决了同一个类的多个对象之间数据和函数的共享问题。   静态数据成员   静态数据成员的作用是:实现同一类的不同对象之间的数据共享。   #include<IOSTREAM>   using namespace std;   class Po

2409atl,atl3.0到7.0的变化

原文 本文不介绍新的ATL7服务器类和属性.这不是一个完整的列表,只是我目前找到的. 串 串转换宏有一些限制.它从栈中分配内存,可能会在大串时溢出栈.函数退出时,释放该串,而不是在函数内引入的域内释放. 它使用过时OLE2ANSI定义.如果你查看MSDN上对_alloca(来转换)的注意,它说它在SEH或C++EH中使用时有限制. 如,看一下ATL3的串转换宏: USES_CONVER

包拯断案 | 数据库从库GTID在变化 为何没有数据写入@还故障一个真相

提问:作为DBA运维的你是否遇到过这些烦恼 1、数据库从库复制链路如何正确配置表过滤信息? 2、数据库从库的GTID在变化,实际却没有数据写入,究竟是什么原因? 心中有章,遇事不慌 作为DBA的你,遇到问题无从下手,除了在问题面前徘徊,还能如何选择?如果你一次或多次遇到该问题还是 无法解决,又很懊恼,该如何排忧呢?关注公众号,关注《包拯断案》专栏,让小编为你排忧解难~ #包拯秘籍#

2020年SEO行业发展变化和趋势分析!

一、搜索引擎算法发展轨迹 第一阶段:人工目录(1997年-2001年“雅虎早期搜索模式”); 第二阶段:文本分析(2001年-2004年“以关键词和背景颜色一样,堆积大量关键词,就会有非常好的排名; 第三阶段:链接分析(2004年-2009年“以反向链接为核心算法的阶段”),这时行业内有句话是内容为王,外链为皇; 第四阶段:智能分析(2009年-现在“以满足用户人性化需求的用户浏览行为分析

漫谈数仓五重奏

第一篇:漫谈数仓 什么是数据仓库?以下是百度百科的定义: 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。数据仓库的特征在于面向主题、集成性、稳定性和时变性。 从传统

保姆级教学:OC监听网络状态变化 Reachability监听网络变化 ios网络变化

本文主要讲解了,在oc开发中,怎么去使用代码进行网络监听,十分的通俗易懂。 首先,在xcode工程中导入SystemConfiguration框架。 然后导入Reachability.h文件。 Reachability文件 点击下载,也可以按照如下内容创建对应的文件。 Reachability.m //文件名Reachability.m/*Copyright (C) 2016 App