拉链表详解

这篇具有很好参考价值的文章主要介绍了拉链表详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、拉链表概念

二、拉链表对应的业务需求

三、代码实现

3.1 数据初始化:

 3.2 创建ods层增量表:

 3.3 创建dwd层拉链表

 3.4 数据更新 ,将数据日期为2023-3-4的日期添加到拉链表中

 3.4.1 先追加数据到ods层表

3.4.2 更新dwd层表数据


一、拉链表概念

        拉链表是一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据(SCD2)的一种常见方式。

      百度百科的解释:拉链表是维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录,通过拉链表可以很方便的还原出拉链时点的客户记录。

二、拉链表对应的业务需求

  1. 数据量比较大;
  2. 表中的部分字段会被update, 如用户的地址,产品的描述信息,订单的状态等等;
  3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,比如,查看某一个用户在过去某一段时间内,更新过几次等等;
  4. 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;
  5. 如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费。
  6. 拉链历史表,既能满足反应数据的历史状态,又可以最大程度的节省存储;

缺点:

  • 开发/使用 成本略高,大量记录频繁变更会导致存储压缩效果降低
  • 不分区的话,数据量大的时候,查询效率低
  • 如果某个日期同步的数据出现问题需要重跑数据,则需要重跑从出问题的日期到当前日期的每一天数据

三、代码实现

       拉链表主要用在dwd层,用来及时记录每个事务状态的。加入ods层数据发生的新增或者更新,相应的dwd层的数据也会改变。拉链表数据生成的思路是:ods更新或者新增的数据 + union +dwd拉链表历史数据(要更改历史数据中状态发生改变的字段)。
方法有两种: 窗口函数和union all 。

3.1 数据初始化:

导入数据到一张初始表 (外部表)

-----------拉链---------------
create database lalian;
use lalian;
drop table if exists orders;
create external table  orders(
    orderid int,
    createdate string,
    modifiedtime string,
    status string
)
row format delimited fields terminated by '\t'
location '/tmp/lalian/orders';
-- [root@reagan180 ~]# vim /opt/aa.txt
-- [root@reagan180 ~]# hdfs dfs -mkdir -p /tmp/lalian/orders/
-- [root@reagan180 ~]# hdfs dfs -put /opt/aa.txt /tmp/lalian/orders/
select * from orders;

拉链表,数据仓库,数据库,sql

 3.2 创建ods层增量表:(按日期分区)

将初始表添加覆盖到ods层表中,数据日期为2023-3-3

create table  ods_orders_inc(
    orderid int,
    createdate string,
    modifiedtime string,
    status string
)partitioned by (day string)
row format delimited fields terminated by '\t';

insert overwrite table ods_orders_inc partition (day='2023-03-03')
select orderid, createdate, modifiedtime, status from orders;

拉链表,数据仓库,数据库,sql

 3.3 创建dwd层拉链表

将ods层数据添加覆盖到dw层,dw表增加  start_time 和 end_time 两列数据用来记录时间动态。

其实默认end_time 为时间极限值 '9999-12-31'

create table dws_orders_his(
    orderid int,
    createdate string,
    modifiedtime string,
    status string,
    start_time string,
    end_time string
)row format delimited fields terminated by '\t';
insert overwrite  table  dws_orders_his
select orderid, createdate, modifiedtime, status, modifiedtime,'9999-12-31' from ods_orders_inc where day='2023-03-03';

 拉链表,数据仓库,数据库,sql

 3.4 数据更新 ,将数据日期为2023-3-4的日期添加到拉链表中

 3.4.1 先追加数据到ods层表

1、删除 hdfs 路径的aa.txt 文件  :[root@reagan180 ~]# hdfs dfs -rm -f /tmp/lalian/orders/*

2、将更新的数据重新传入hdfs路径:

               [root@reagan180 ~]# hdfs dfs -put /opt/aa.txt /tmp/lalian/orders/

where条件,不会覆盖日期2023-3-3的数据

insert overwrite table ods_orders_inc partition (day='2023-03-04')
select orderid, createdate, modifiedtime, status from orders 
where modifiedtime='2023-3-4';

3.4.2 更新dwd层表数据

可以采用union all 和窗口函数

union all :

insert overwrite  table  dws_orders_his
select tb.orderid,
       tb.createdate,
       tb.modifiedtime,
       tb.status,
       tb.start_time ,
       tb.end_time
from(
(select orderid, createdate, modifiedtime, status, modifiedtime as start_time,'9999-12-31' as end_time
             from ods_orders_inc where day='2023-03-04')
union all
(select t1.orderid,
        t1.createdate,
        t1.modifiedtime,
        t1.status,
        t1.start_time,
        if(t2.orderid is not null and t1.end_time>'2023-03-04', t2.modifiedtime, '9999-12-31') endtime
from dws_orders_his t1
left join
    (select orderid from ods_orders_inc where day='2023-03-04') t2 on t1.orderid=t2.orderid  ))tb
     order by tb.orderid,tb.start_time;

窗口函数:

lead(start_time, 1) over (partition by orderid order by start_time)

补充一下每日的用户更新表该怎么获取:文章来源地址https://www.toymoban.com/news/detail-797797.html

  1. 我们可以监听Mysql数据的变化,比如说用Canal,最后合并每日的变化,获取到最后的一个状态。
  2. 假设我们每天都会获得一份切片数据,我们可以通过取两天切片数据的不同来作为每日更新表。
  3. 每日的变更流水表。
  4. 通过etl工具对操作型数据库按照时间字段增量抽取到ods或者数据仓库(每天抽取前一天的数据),形成每天的增量数据(实际中使用最多的情形)。

到了这里,关于拉链表详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL Server存储过程(数据库引擎)使用详解

    SQL Server 中的存储过程是一组一个或多个 Transact-SQL 语句的引用。过程类似于其他编程语言中的构造,因为它们可以: 接受输入参数并以输出参数的形式向调用程序返回多个值。 包含在数据库中执行操作的编程语句。其中包括调用其他过程。 向调用程序返回状态值,以指示成

    2023年04月09日
    浏览(50)
  • eclipse连接SQL Server数据库(详解很细心)

    目录 第一步:启动SQl Server服务 第二步:进入数据库建库建表 第三步:进入 eclipse 编写连接数据库的代码     编写连接库的完整代码  里面的main方法是测试是否成功连接数据库 以下效果如果你的控制台输出的一样就代码数据库已连接成功

    2024年02月11日
    浏览(44)
  • SQL SERVER从一台服务器复制数据库至另一台数据库详解--方法1

    一、 数据库的备份 1 选择想要复制的数据库   2右键点击数据库,选择任务、备份   3 生成备份文件   4 退出到主界面,右键新建数据库  5 在新建的数据库中右键选择还原,点击设备后面的三个点,在弹窗中把刚才备份的数据库文件选中。  6 点击确定以后,数据库还原完毕

    2024年02月06日
    浏览(76)
  • 【SQL Server】数据库开发指南(七)MS-SQL存储过程全面解析:种类、优点和创建方法详解

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2024年02月07日
    浏览(105)
  • 数据仓库(什么是拉链表)

    中文名 : 企业数据仓库 外文名 : Enterprise Data Warehouse 简称 : EDW 数据仓库(DW)概念的创始人W. H.Inmon对数据仓库下了这样的定义:“数据仓库是一个面向主题的、集成的、非易失的且随时间变化的数据集合,用来支持管理人员的决策。”数据仓库将大量用于事物处理的传统数

    2024年04月10日
    浏览(42)
  • 数据仓库-拉链表

    在数据仓库中制作拉链表,可以按照以下步骤进行: 确定需求:首先明确需要使用拉链表的场景和需求。例如,可能需要记录历史数据的变化,以便进行时间序列分析等。 设计表结构:在数据仓库中,拉链表通常由两个表组成:当前表和历史表。当前表存储最新的数据,历

    2024年02月06日
    浏览(42)
  • 数据仓库-拉链算法

    数据仓库-拉链算法,如何处理开链、闭链数据

    2024年02月16日
    浏览(32)
  • Python SQL 数据库操作利器:SQLAlchemy 库详解(看这一篇文章就够了)

    引言: Python 是一门广受欢迎的编程语言,而 SQL 则是用于管理和操作数据库的标准查询语言。SQLAlchemy 是一个功能强大的 Python 库,它提供了一种与多种数据库进行交互的灵活方式。本文将介绍 SQLAlchemy 库,并以九个重要的要点详细解释其功能和用法。 SQLAlchemy 简介 SQLAlchem

    2024年02月07日
    浏览(66)
  • 三、数据仓库实践-拉链表设计

         拉链表,学名叫缓慢变化维(Slowly Changing Dimensions),简称渐变维(SCD),俗称拉链表,是为了记录段的历史变化而设计出来的一种数据存储模型,常见于维度表设计,在数据仓库相关的面试中,也经常有被问到。但是在工程实践中,拉链表真是太麻烦了,而且是

    2024年02月05日
    浏览(43)
  • Microsoft SQL Server 2019 下载、安装及Java JDBC配置连接数据库(多图详解 超详细)

    一、下载 下载链接Microsoft SQL Server 二、安装 1.找到刚刚下载的文件,双击打开后,选择基本并接受 2.选择接受 3.选择安装位置,并点击安装,然后等待下载安装完成 4.正在安装 -5.遇到了一个问题,重启一下(未遇到该问题的可忽略此步) 6.安装成功,点击安装SSMS 7.点击下载

    2024年02月04日
    浏览(108)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包