拉链表的设计与实现

2023-11-14

一、什么是拉链表

        针对订单表、订单商品表,流水表,这些表中的数据是比较多的,如果使用全量的方式,会造成大量的数据冗余,浪费磁盘空间。

        所以这种表,一般使用增量的方式,每日采集新增的数据。

        在这注意一点:针对订单表,如果单纯的按照订单产生时间增量采集数据,是有问题的,因为用户可能今天下单,明天才支付,但是Hive是不支持数据更新的,这样虽然MySQL中订单的状态改变了,但是Hive中订单的状态还是之前的状态。

想要解决这个问题,一般有这么几种方案:

        第一种:
        每天全量导入订单表的数据,这种方案在项目启动初期是没有多大问题的,因为前期数据量不大,但是随着项目的运营,订单量暴增,假设每天新增1亿订单,之前已经累积了100亿订单,如果每天都是全量导入的话,那也就意味着每天都需要把数据库中的100多亿订单数据导入到HDFS中保存一份,这样会 极大的造成数据冗余,太浪费磁盘空间了。

        第二种:
        只保存当天的全量订单表数据,每次在导入之前, 删除前一天保存的全量订单数据,这种方式虽然不会造成数据冗余,但是 无法查询订单的历史状态,只有当前的最新状态,也不太好。

        第三种:
        拉链表,这种方式在普通增量导入方式的基础之上进行完善, 把变化的数据也导入进来,这样既不会造成大量的数据冗余,还可以查询订单的历史状态。

        拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓 拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有历史变化的信息。

下面就是一张拉链表,存储的是用户的最基本信息以及每条记录的生命周期。我们可以使用这张表拿到当天的最新数据以及之前的历史数据。

 二、制作拉链表

        拉链表主要用在dwd层(明细数据层),用来及时记录每个事务状态的。加入ods层(原始数据层)数据发生的新增或者更新,相应的dwd层的数据也会改变。拉链表数据生成的思路是:ods更新或者新增的数据 + union +dwd拉链表历史数据(要更改历史数据中状态发生改变的字段)。

        方法有两种: 窗口函数和union all 。

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';

2.创建数据增量表


-- 创建增量表ods_orders_inc --
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 
    where modifiedtime='2023-03-03';

3.创建历史记录表


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-30'
       from ods_orders_inc where day='2023-03-03';

4.数据更新

--2023-03-04--
-- 覆写增量表ods_orders_inc --
insert overwrite table ods_orders_inc partition (day='2023-03-05')
select orderid,createdate,modifiedtime,status from orders
where modifiedtime='2023-03-05' or (createdate='2023-03-05' and modifiedtime='2023-03-05');
 
 
-- dws_orders_his --
with t1 as (
    select orderid,createdate,modifiedtime,status,modifiedtime as start_time,'9999-12-30' as end_time
from ods_orders_inc where day='2023-03-04'
union
select t1.orderid,
       t1.createdate,
       t1.modifiedtime,
       t1.status,
       t1.start_time,
       case when t2.createdate is not null and t1.end_time>'2023-03-04'
           then '2023-03-04' else t1.end_time end end_time
from dws_orders_his t1 left join (
    select orderid,createdate from ods_orders_inc where day='2023-03-04'
    ) t2
on t1.orderid=t2.orderid
)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拉链表的设计与实现 的相关文章

  • IDE介绍

    集成开发工具 gt gt gt IDE 编码工具取代了简单的记事本工具 辅助程序员编写源代码的常用高效编写工具 类似word 我们写文档会打开word文档来编写 代码也同样需要借助工具来开发 常见的编辑工具有记事本 sublime text

随机推荐

  • SD HOST——(一)SD简介

    Micro SD有九个引脚 TF卡只要八个 少一个地 CLK CMD 双向口 用于发命令和接收response VDD GND GND D3 D2 D1 D0 D3 D0不一定传输的是数据 读SD内部寄存器状态也可以从D3 30输出 CMD
  • Pytorch并行训练方法-单机多卡

    简单方便的 nn DataParallel DataParallel 可以帮助我们 使用单进程控 将模型和数据加载到多个 GPU 中 控制数据在 GPU 之间的流动 协同不同 GPU 上的模型进行并行训练 细粒度的方法有 scatter g
  • 通过栈实现算术表达式的计算

    最近在看数据结构的栈 其中有一节为栈应用到算术表达式的计算 接下来我讲举例说明如何用栈去计算 如有不对的地方 请各位大神指教 1 定义操作符的优先级 作为栈顶操作符时优先级仅高于 作为栈顶操作符时优先级是最高的 和 优先级一样 但是一个作为
  • redis-cluster集群添加或删除节点以及槽重新分片

    Redis版本 5 0 0 redis 5 0 0版本后可以不用安装ruby环境 集群命令说明 redis cli cluster help Cluster Manager Commands create host1 port1 hostN
  • LLVM 介绍

    https blog csdn net weixin 38244174 article details 82705181 最近开始搞LLVM 下面我将从以下五个方面来介绍LLVM 分别是 1 LLVM是什么 2 LLVM的组成部分 3 LL
  • Python爬虫教程(非常详细)从零基础入门到精通,看完这一篇就够了

    对于绝大多数想要学习Python的朋友而言 爬虫绝对是学习Python的最好的骑手和入门方式 我当时选择Python学习 也是瞄准了Python爬虫 因为爬虫思维模式固定 编程模式也相对简单 一般在细节处理上积累一些经验都可以成功 一 正确
  • __setup宏定义

    setup宏定义 struct obs kernel param const char str int setup func char int early define initconst section init rodata defin
  • QT程序自适应窗口大小

    作为QT菜鸟的一员 总是容易遇到各种问题 然后历经千辛万苦解决它 问题 我的程序需要在ARM板 Linux系统 上跑 也需要在PC Windows上 跑 他们拥有不同大小的屏幕 在程序中布局的界面能够很好地适应窗口的大小变化 但是在UI设计
  • HTTP协议实例详解

    HTTP是一个应用层协议 由请求和响应构成 是一个标准的客户端服务模型 HTTP通常承载于TCP协议之上 有时候也承载于TLS或SSL协议层之上 这个时候 就成了常说的HTTPS 默认HTTP的端口号为80 HTTPS的端口号为443 缺点
  • Netty聊天系统(1)通过自定义协议实现客户端与服务器端通信

    1 自定义实现客户端与服务器端通信的协议 1 1 通信协议的设计 自定义的通信协议需要哪些内容 1 魔数 第一个字段一般是魔数 一般固定的几个字节 一个PNG图片的编码中有固定数量固定内容的字节 用于表示这是一个PNG图片 Java的Cla
  • 百度搜索 抓取真实url

    现在的百度搜索url都是加密的 不是真实url 比如搜索豆瓣 复制链接地址得到的url如下 https www baidu com link url vsdsl04PUGwYT udMGNDBSgQ4D62grmcfm8fM4LVjYLVV
  • vue初始化项目出现 npm ERR fatal unable to access ‘httpsgithub.comnhnraphael.git‘ OpenSSL SSL_read

    vue初始化项目出现npm ERR fatal unable to access https github com nhn raphael git OpenSSL SSL read 错误 解决方法 没有安装预编译插件 我的项目是用sass
  • GM(1,1)灰色预测模型——详细过程与python实现

    文章目录 前言 一 灰色模型的建模步骤及原理 1 灰色模型的基本概念 2 灰色模型的建模步骤 二 模型建立 1 确定原始数据 2 累加数列和邻均值等权数列 3 建立关于t 的白化形式一阶一元微分方程 GM 1 1 三 模型求解 1 利用矩阵
  • Ubuntu的Firefox浏览器无法播放视频

    一 flash插件 sudo apt get install flashplugin installer 二 视频解码器 由于 ubuntu restrcited extras 软件包在 multiverse 仓库中 因此你应验证系统上已启
  • EClipse执行程序,提示:your project contains error(s),please fix them before running your application。

    今天电脑重新安装了Eclipse系统 JDK ADT SDK 然后打开1年多前编辑好的工程项目 结果总是会弹出错误框 提示信息为 Your project contains error s please fix them before ru
  • RabbitMQ的持久化 面试

    交换机的持久化 交换机的持久化其实就是相当于将交换机的属性在服务器内部保存 当MQ的服务器发生意外或关闭之后 重启RabbitMQ时不需要重新手动或执行代码去建立交换机 交换机会自动建立 相当于一直存在 其是在声明交换器的时候 将 dura
  • sklearn与分类算法

    导读 众所周知 Scikit learn 以前称为 scikits learn 是一个用于 Python 编程语言的免费软件机器学习库 它具有各种分类 回归和聚类算法 包括支持向量机 随机森林 梯度增强 k means 和 DBSCAN 旨
  • Golang 数据结构 —— 字典

    Golang 数据结构 字典 字典存储 key value 对 Go提供了非常方便的实现 内置的map类型 本文增强内置的map类型 添加便捷的操作用于获取或改变其内容 创建ItemDictionary泛型 并发安全的 能够生成任何具体类型
  • linux配置svn 版本管理之创建仓储和权限管理

    1 安装 yum install subversion 2 配置 2 1 创建仓库 我们这里在 home下建立一个名为svn的仓库 repository 以后所有代码都放在这个下面 创建成功后在svn下面多了几个文件夹 root local
  • 拉链表的设计与实现

    一 什么是拉链表 针对订单表 订单商品表 流水表 这些表中的数据是比较多的 如果使用全量的方式 会造成大量的数据冗余 浪费磁盘空间 所以这种表 一般使用增量的方式 每日采集新增的数据 在这注意一点 针对订单表 如果单纯的按照订单产生时间增量