为什么要做拉链表

拉链表适合于:数据会发生新增和变化,但是大部分是不变的,且是缓慢变化的(如电商中用户信息表中的手机号不可能每天都变化),如果是快速变化的(如每天一变),则每天做全量更新(事务型事实表)。主要目的是节省存储空间。

拉链表的使用场景

在数据仓库的数据模型设计过程中,经常会遇到下面这种表的设计:

  • 1 有一些表的数据量很大,比如一张用户表,大约10亿条记录,50个字段,这种表,即使使用ORC压缩,单张表的存储也会超过100G,在HDFS使用双备份或者三备份的话就更大一些。
  • 2 表中的部分字段会被update更新操作,如用户联系方式,产品的描述信息,订单的状态等等。
  • 3 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态。
  • 4 表中的记录变化的比例和频率不是很大,比如,总共有10亿的用户,每天新增和发生变化的有200万左右,变化的比例占的很小

什么是拉链表

记录每条信息的生命周期,一旦一条信息的生命周期结束,就重新开始一条新纪录,并把当前日期放入生效日期。 如果当前日期至今有效,在结束日期放入一个最大值,例如(9999-99-99)

- 优势:订单1经历了四个生命周期,如果每天增量同步数据,则一年有365条数据,而拉链表只会产生4条数据

制作拉链表

首先初始化拉链表

通常要在原表的基础上加入start_date,end_date,并从原表导入数据到拉链表

drop table if exists dwd_order_info_his;
create external table dwd_order_info_his(`id` string COMMENT '订单编号',`order_status` string COMMENT '订单状态',`start_date`  string COMMENT '有效开始日期',`end_date`  string COMMENT '有效结束日期'
) COMMENT '订单拉链表'

创建临时表整个中间数据

临时表和拉链表表结构一致,只是为了存储中间过程。

drop table if exists dwd_order_info_his_tmp;
create external table dwd_order_info_his_tmp(`id` string COMMENT '订单编号',`order_status` string COMMENT '订单状态',`start_date`  string COMMENT '有效开始日期',`end_date`  string COMMENT '有效结束日期'
) COMMENT '订单拉链临时表'

向临时表中插入数据

插入前,拉链表数据

订单新增表数据

插入数据后

订单1和订单2,订单状态都发生了改变,产生了新数据

具体sql

insert overwrite table dwd_order_info_his_tmp
select * from
(
select
id,total_amount,order_status,user_id,payment_way,out_trade_no,create_time,operate_time,'2019-02-14' start_date,'9999-99-99' end_date
from dwd_order_info where dt='2019-02-14'union all
select oh.id,oh.total_amount,oh.order_status,oh.user_id,oh.payment_way,oh.out_trade_no,oh.create_time,oh.operate_time,oh.start_date,if(oi.id is null, oh.end_date, date_add(oi.dt,-1)) end_date
from dwd_order_info_his oh left join (
select
*
from dwd_order_info
where dt='2019-02-14'
) oion oh.id=oi.id
)his
order by his.id, start_date;

分为两个部分数据 第一部分把新增修改表直接插入,这部分数据都是新鲜的,end_date是9999-99-99

第二部分是原拉链表和新增变化表做左连接,原表存在id且终止时间为无限的数据会保留,说明这部分数据需要变更。(如果右表id为空,说明这部分数据没有任何改变,end_date保持不变,如果右表数据存在,说明经过了改变,则,end_date需要减1),所以这部分完成了历史数据的更改

将拉链表数据用临时表覆盖

因为hive修改字段值不方便,直接全变覆盖

insert overwrite table dwd_order_info_his
select * from dwd_order_info_his_tmp;

单张表超过30个字段_拉链表相关推荐

  1. update 两个表关联_拉链表(二)

    拉链表(一) 拉链表(二) 一.前言 在上一节简单介绍了拉链表,本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表. 这里以上节介绍的用户表(user) 举例 二.涉及到 ...

  2. 2清空所有表_拉链表(二)

    拉链表(一) 拉链表(二) 一.前言 在上一节简单介绍了拉链表,本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表. 这里以上节介绍的用户表(user) 举例 二.涉及到 ...

  3. mysql 时间拉链表_拉链表 - 夜半钟声到客船 - 博客园

    1.为什么要做拉链表 拉链表适用于同步新增和变化的数据!对于周期型事实表,采用同步新增和变化的方式! 使用场景: 1)比如订单状态: 三天内该订单状态发生了变化,但是同一个事物内进行的 2)人的出行轨 ...

  4. 查一个字段中字符集超过30的列_详细解读MySQL的30条军规

    一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...

  5. plsql 查看表结构所有的字段_产品操作MySQL第2篇 – 设计一张表

    本资料为产品岗位作为日常工作参考,语言口语化 At 2019/4/16 By David.Yang 了解数据表的"字段"概念 我们前面说到,Excel.数据表都有一个表头, 比如学 ...

  6. 线性表之链式存储结构_单链表相关算法

    在存储结构上,不需要连续的存储空间,需要上一个结点的指针域 指向下一个结点即可,找到一个结点就可以找到下一个结点. 学习教材是大话数据结构,加上自己的一些个人理解.这个算法 有点绕,需要对指针 相关内 ...

  7. hive中实现行转列_漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

    全文由下面几个部分组成: 先分享一下拉链表的用途.什么是拉链表. 通过一些小的使用场景来对拉链表做近一步的阐释,以及拉链表和常用的切片表的区别. 举一个具体的应用场景,来设计并实现一份拉链表,最后并通 ...

  8. 关于数据仓库中变化历史数据处理方式:全量表、快照表、拉链表

    关于数据仓库中变化历史数据处理方式:全量表.快照表.拉链表 一.全量表 二.快照表 三.拉链表 对于数据仓库中变化的历史数据存储,一般有三种方式:全量表.快照表.拉链表 一.全量表 直接全量导入,覆盖 ...

  9. 数仓潮汐猎人 | 数据仓库企业数仓拉链表制作​

    拉链表 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 下面就是一张拉链表,存储的是用户的最基本信息以及每条 ...

最新文章

  1. 操作系统学习笔记 第三章:处理机调度与死锁(王道考研)
  2. 求解单源最短路径的几种算法
  3. 帆软填报提交显示违反唯一约束_贵州2020年高考网上填报志愿时间确定!这些事项需要注意...
  4. Oracle感慨(转)
  5. Spring IoC(一)IoC容器的设计与实现:BeanFactory与ApplicationContext
  6. hive(4)——元数据概述
  7. python shell运行当前程序、可以按下_Python下调用Linux的Shell命令的方法
  8. IE8的 JS 引擎如此不堪(二) - 解决方案
  9. Dockerfile中CMD和ENTRYPOINT的区别
  10. mongodb笔记2
  11. SQL Server 2005混合模式登录配置
  12. html双击单元格修改,JS实现鼠标双击选中表格单元格代码
  13. ir2110s驱动工作原理
  14. OpenBSD 6.8 切换到国内镜像源的一种临时方法:声明PKG_PATH
  15. windows10专业版安装应用商店方法
  16. codeforces 1567 E. Non-Decreasing Dilemma
  17. eXtremeTable -
  18. win10 任务栏的工具栏 以及重启消失的解决方法
  19. 《后端从入门到熟悉-序言》
  20. systemd介绍六:Journalctl查看并操作sytemd日志

热门文章

  1. 嵩天-Python语言程序设计程序题--第二周:基本图形绘制
  2. java 获取光标_如何在java中使用Windows API获取当前鼠标光标类型?
  3. ng-template 使用过程中默认参数不能按照期望工作的问题单步调试
  4. SAP UI5 应用开发教程之十七 - 聚合绑定在 UI5 复合控件中的使用
  5. SAP Spartacus lazy load module 里包含了被其他 Component 静态引用的组件该怎么办
  6. docker run hello-world 遇到错误消息 - error during connect
  7. SAP Spartacus 服务器端 nodejs 应用里渲染 Angular Component 的一个例子
  8. 使用 yo 命令行向导创建 SAP UI5 应用
  9. 关于如何能够快速找到某个文本在所有文件中的出现位置
  10. SAP S/4HANA 的30天免费试用版