数仓之拉链表分区设计

news2024/9/24 23:29:35

目录

适用场景

优缺点

案例


适用场景

        当数据量较大,表中某些字段有变化,但变化频率不是很高,而业务需求又需要统计这种变化状态,如果每天存储一份全量数据,不仅浪费存储空间,且不便于业务统计;这时,拉链表的作用就体现出来了,既节省空间,又满足需求。

优缺点

  • 优点:(1)保留了数据的历史信息;(2)节省存储空间;
  • 缺点:同步和回滚逻辑复杂

案例

        假设业务系统中 存有 一张  “商家信息表” ==》  shops  ,每天会有新增、修改(假设哈),

而我们数仓中需要取这张表来做分析

字段类型描述

shopid

int 商铺id
useridint商铺负责人id
areaidint区域id
shopnamevarchar商铺名称
shoplevelint商铺等级
statusint商铺状态
createtimevarchar创建日期
modifytimevarchar修改日期

(采集的第一天)原始数据为:

100050,1,100225,"WSxxx营超市",1,1,"2020-06-28","2020-07-01 13:22:22"
100052,2,100236,"新鲜xxx旗舰店",1,1,"2020-06-28","2020-07-01 13:22:22"
100053,3,100011,"华为xxx旗舰店",1,1,"2020-06-28","2020-07-01 13:22:22"

首先在创建 一张 增量分区表:

create table ods_shops
(
    `shopid`     int COMMENT '商铺ID',
    `userid`     int COMMENT '商铺负责人',
    `areaid`     int COMMENT '区域ID',
    `shopname`   string COMMENT '商铺名称',
    `shoplevel`  int COMMENT '商铺等级',
    `status`     int COMMENT '商铺状态',
    `createtime` string COMMENT '创建日期',
    `modifytime` string COMMENT '修改日期'
) COMMENT '商家信息表'
    PARTITIONED BY (`ds` string);

从业务系统采集数据到仓库中,指定数据分区。2023-03-01

 创建拉链表:

create table dwd_shops_his
(
    `shopid`     int COMMENT '商铺ID',
    `userid`     int COMMENT '商铺负责人',
    `areaid`     int COMMENT '区域ID',
    `shopname`   string COMMENT '商铺名称',
    `shoplevel`  int COMMENT '商铺等级',
    `status`     int COMMENT '商铺状态',
    `createtime` string COMMENT '创建日期',
    `modifytime` string COMMENT '修改日期',
    `start_date` string  COMMENT '生效起始日期',
    end_date string COMMENT '失效日期'
) COMMENT '商家信息表'
    PARTITIONED BY (`dt` string);

把首日的数据加载到拉链表中:第一次的数据 闭链时间都给默认 最大值 9999-12-31

insert overwrite table dwd_shops_his
select shopid,
       userid,
       areaid,
       shopname,
       shoplevel,
       status,
       createtime,
       modifytime,
       case
           when modifytime is not null then substr(modifytime, 0, 10)
           else substr(createtime, 0, 10) end as startdate,//开链时间
       '9999-12-31' , //闭链时间
       '9999-12-31'   //分区,以闭链时间做分区,9999-12-31分区存储的数据 为有效数据 ,其他时间分区存储的数据都为当天失效的数据                                                                                as enddate
from ods_shops
where ds = '2023-03-01';

(采集的第二天)原始数据发生了变化:

//业务修改的数据
100050,1,100225,"WSxxx营超市",10,10,"2020-06-28","2023-03-02 13:22:22","2023-03-02"
100052,2,100236,"新鲜xxx旗舰店",10,10,"2020-06-28","2023-03-02 13:22:22","2023-03-02"
//业务新增的数据
100054,10,100012,"华为xxx旗舰店1",1,1,"2023-03-02","","2023-03-02"

根据创建时间和修改时间 抽取 数据到 ods_shops增量表分区中   2023-03-02

 这时候增量表中 有两个分区:包含修改前、修改后、没修改、新增的数据

(修改后2条+未修改1条+新增1条+修改前2条)

 把2023-03-02分区的 数据 装载到 拉链表 ,同时修改 闭链时间

代码为:

insert overwrite table dwd_shops_his
 SELECT *,T.end_date FROM
    (
        SELECT
        A.shopid,
       A.userid,
       A.areaid,
       A.shopname,
       A.shoplevel,
       A.status,
       A.createtime,
       A.modifytime,
       A.start_date,
        CASE
               WHEN A.end_date = '9999-12-31' AND B.shopid IS NOT NULL THEN current_date()
               ELSE A.end_date
               END AS end_date
           FROM dwd_shops_his AS A
               LEFT JOIN ods_shops AS B
               ON A.shopid = B.shopid and A.dt='9999-12-31' and B.ds='2023-03-02'
       UNION all
          SELECT C.shopid,
       C.userid,
       C.areaid,
       C.shopname,
       C.shoplevel,
       C.status,
       C.createtime,
       C.modifytime,
                  c.ds AS start_date,
                 '9999-12-31' AS end_date
             FROM ods_shops AS C where ds='2023-03-02'
        ) AS T ;

(修改后2条+未修改1条+新增1条)共计 4条 有效数据

查询有效数据:

select * from dwd_shops_his where dt='9999-12-31';

查看所有数据

select * from dwd_shops_his;

 拉链记录:有两条数据在 2023-03-02 失效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机入门————LED灯的控制

LED的电路图通过原理图看出,LED灯是接单片机芯片的P20~P27的一共有8个LED,51单片机也是8字节的P20x010xFE————1111 1110P20xFE可以表示把在P2端的第一个灯点亮1 表示高电平0表示低电平当为0的时候形成一个完整回路,电流从高电平流向低电平…

【备战面试】每日10道面试题打卡-Day2

本篇总结的是Java基础知识相关的面试题,后续也会更新其他相关内容 文章目录1、 和 equals 的区别是什么?2、你重写过 hashcode 和 equals 吗,为什么重写equals时必须重写hashCode方法?3、为什么Java中只有值传递?4、BI…

SQL SERVER中SCHEMA的詳解

SQL SERVER中SCHEMA的講解1. Introduction1.1 優勢1.2 內置schema2. Create Schema2.1 Parameters2.2 Sql3.Awakening1. Introduction 1.1 優勢 数据库模式为我们提供了在数据库中创建逻辑对象组的灵活性。如果多个团队使用同一个数据库,我们可以设计各种模式来分組…

基于Ubuntu的Brainframe视觉AI分析平台搭建的详细步骤

目录 引言: 过程: 下载Brainframe安装包: 搭建Brainframe命令接口: 解决下载Docker速度慢的方法: 安装Docker : Unable to find image hello-world:latest locally 问题的解决: Step1:进…

Vue3创建项目(四)axios封装及接口配置

项目结构: 目录 🍉🍉🍉index.ts 🍉🍉🍉 api.ts 看完需要预计花费10分钟。 请求拦截器与响应拦截器 阅读下面代码需先了解以下内容: 请求拦截器: 请求拦截器的作用是在请求发送前进…

Windows搭建机器学习环境

一、环境介绍Anaconda:Anaconda offers the easiest way to perform Python/R data science and machine learning on a single machine. Start working with thousands of open-source packages and libraries today.Anaconda包括Conda、Python以及一大堆安装好的工…

Qt信号与槽机制——新手友好

目录 一 为什么会有这个机制 二 信号与槽是什么 三 信号 四 槽 五 使用 1 最简单的 2 函数指针 3 用Lambda表达式实现 一 为什么会有这个机制 我们平时的一个网页,如果点击网页上不同的部分会有不同的相应动作。比如点击超链接就会实现网页的跳转&#xff0c…

Code Virtualizer 3.1.4 Crack

Code Virtualizer 是一个强大的 Windows 应用程序代码混淆系统,它可以帮助开发人员保护他们的敏感代码区域免受逆向工程的影响,基于代码虚拟化的非常强大的混淆代码。 Code Virtualizer 会将您的原始代码(Intel x86/x64 指令)转换…

剑指 Offer day3, day4

剑指 Offer day3, day4 字符串和数组的操作。 剑指 Offer 05. 替换空格 剑指 Offer 05. 替换空格 - 力扣(Leetcode) 方法二:原地修改 在 C 语言中, string 被设计成「可变」的类型(参考资料)&#xff…

python海龟绘图

一、基础 (一)介绍 海龟绘图(Turtle Graphics):“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始…

Git分支的合并策略有哪些?Merge和Rebase有什么区别?关于Merge和Rebase的使用建议

Git分支的合并策略有哪些?Merge和Rebase有什么区别?关于Merge和Rebase的使用建议1. 关于Git的一些基本原理1.1 Git的工作流程原理2. Git的分支合并方式浅析2.1 分支是什么2.2 分支的合并策略2.2.1 Three-way-merge(三向合并原理)2…

前端已死?我看未必,但「低代码」已剑指前端程序员

本文笔者会从以下几个方面分享,希望能够帮助正在迷茫的前端小伙伴提供一点思路! 逛技术博客 不局限框架 全栈工程师兴起 关注前沿 写技术文章 录制前端视频 总结 2023第一季度快过去了,没工作的找到工作了吗?有工作的加薪了…

Hbase的基本概念与架构

一、Hbase的概念 HBase是Hadoop的生态系统,是建立在Hadoop文件系统(HDFS)之上的分布式、面向列的数据库,通过利用Hadoop的文件系统提供容错能力。如果你需要进行实时读写或者随机访问大规模的数据集的时候,请考虑使用H…

Canal数据同步配置

文章目录Canal数据同步配置0.canal工作原理1.**检查binlog功能是否有开启**2.如果显示状态为OFF表示该功能未开启,开启binlog功能3.**在mysql里面添加以下的相关用户和权限**4.下载安装Canal服务5.修改配置文件6.进入bin目录下启动7.idea中配置Canal数据同步配置 c…

记录第一次接口上线过程

新入职一家公司后,前三天一直在学习公司内部各种制度文化以及考试。 一直到第三天组长突然叫我过去,给了一个需求的思维导图,按照这个需求写这样一个接口, 其实还不错,不用自己去分析需求,按照这上面直接开…

工业机器人有哪些类型?如何利用工业网关集中监测管理?

工业机器人在制造业中的应用与日俱增,使用工业机器人,不仅提高了设备和场地的利用率,还能保持稳定的产品水平。随着工业机器人的大规模部署,对于数量众多、类型各异、功能不一的机器人的监测、管理和维护,也成为企业面…

Java 异常

文章目录1. 异常概述2. JVM 的默认处理方案3. 异常处理之 try...catch4. Throwable 的成员方法5. 编译异常和运行异常的区别6. 异常处理之 throws7. 自定义异常8. throws 和 throw 的区别1. 异常概述 异常就是程序出现了不正常的情况。 ① Error:严重问题&#xff…

Nessus: 漏洞扫描器-网络取证工具

Nessue 要理解网络漏洞攻击,应该理解攻击者不是单独攻击,而是组合攻击。因此,本文介绍了关于Nessus历史的研究,它是什么以及它如何与插件一起工作。研究了Nessus的特点,使其成为网络取证中非常推荐的网络漏洞扫描工具…

maven高级知识。

目录 一、分模块开发 1、分模块开发设计 2、依赖管理 二、继承和聚合 1、聚合 2、继承 三、属性 1、基本介绍 2、版本管理 四、多环境配置与应用 1、多环境开发 2、跳过测试 五、私服 1、私服安装 2、私服仓库分类 一、分模块开发 1、分模块开发设计 ▶ 示意图 …

【测绘程序设计】——计算卫星位置

本文分享了根据广播星历计算卫星于瞬时地固系下位置的计算程序(C#版)(注:瞬时地球坐标系坐标经极移改正即可获得协议地球坐标系坐标),相关源代码(完整工程,直接运行;包含实验数据)及使用示例如下。 目录 Part.Ⅰ 使用示例Part.Ⅱ 代码分析Chap.Ⅰ 数据结构Chap.Ⅱ 计…