面试官:了解拉链表吗?描述一下

拉链表是数据仓库中一种重要的模型,相信很多数据工作者都接触过,面试也是经常考察的点。

但是很多人第一次接触“拉链表”这个词,难免会产生疑惑:拉链表是什么?

什么是拉链表

按照度娘的解释:“拉链表是一种针对数据仓库设计中表存储数据的方式而定义的数据模型,它有点类似于快照,用于维护历史状态及最新状态数据。”

这么看还是有点难理解,既然如此,那我们先不管,先来看以下场景:

  • 假如有张表如表1-1所示,每天的数据量大概有50w
  • 表中有些字段会被 update,如表1-2,且每天更新的数据量很小,大约只有5k
  • 有些报表需要查看历史某个日期的数据
  • 存储空间有限,需要尽可能的节约存储空间

问:你会怎么将其装入数仓中?

表1-1:

1

Agnes

123

2

Max

456

3

Tony

789

...

...

...

表1-2:

1

Agnes

123

2

Max

456

3

Tony

321

...

...

...

每天追加一份全量数据

这种方式比较简单粗暴,如表1-3,不仅操作方便,还可以反映历史变化。但是弊端也很明显:存在数据冗余、浪费存储空间。

每天50w,一个月就有1500w了,时间越长,数据量越多,然而实际变化的数据每天只有5k,剩下的数据几乎都是重复存储的,极大浪费存储空间。

表1-3

1

Agnes

123

2

Max

456

3

Tony

789

1

Agnes

123

2

Max

456

3

Tony

321

...

...

...

直接覆盖原来的数据

这种方式也很简单,直接全表 truncate 再 insert,虽然空间节省了,但缺点也很明显,会把历史数据覆盖掉,没办法反映历史数据的变化。

使用拉链表

在原表结构的基础上,加两个字段:start_date 和 end_date,第一次抽取数据的时候,将 start_date 初始化为抽取日期,end_date 初始化为永久日期,如表1-4所示

表1-4:

1

Agnes

123

20230328

99999999

2

Max

456

20230328

99999999

3

Tony

789

20230328

99999999

...

...

...

...

...

之后的每一次抽取,则需要对比当日数据以及历史数据,将有变化的历史数据的 end_date 改成当日抽取日期;

将新抽取的有变化的数据按照初始化的方式设置 start_date 和 end_date。如表1-5所示

表1-5:

1

Agnes

123

20230328

99999999

2

Max

456

20230328

99999999

3

Tony

789

20230328

20230329

3

Tony

321

20230329

99999999

...

...

...

...

...

这种数据模型就是拉链表,它既能反映历史变化,又能节省空间,岂不美哉?

如何实现拉链表

既然理解了什么是拉链表,那么应该如何实现呢?

方式一

(1)获取当日数据;

(2)比较当日数据及历史数据,找出新增和变化的数据,存到临时表,并将开始日期置为当前日期,结束日期置为最大日期;

(3)将历史数据表中的变化数据的结束日期更新为当前日期,即闭链;

(4)将临时表的新增和变化数据插入历史数据表中,即开链。

方式二

(1)获取当日数据;

(2)比较当日数据和昨日数据,找出新增数据和变化后数据;

(3)比较昨日数据和当日数据,找出删除数据和变化前数据;

(4)删除历史数据表中的删除数据和变化前数据;

(5)将新增数据和变化后数据插入历史数据表中,把开始日期置为当前日期,结束日期置为最大日期;

(6)将删除数据和变化前数据插入历史数据表中,把结束日期置为当前日期。

方式一比较简洁;在数据量比较大的情况下,方式二效率比较高,因为用删除插入的操作替代更新的操作,当然,这是对于传统数据库而言,具体的方式应根据实际数据量和数据库来制定。

小结

本文用一个案例简单介绍了拉链表的含义以及实现拉链表的方式,如果有什么错误,欢迎大家指正;如果对大家有帮助,希望大家能给个赞给予肯定支持,谢谢。

持续关注不迷路,转载请注明出处:大数据的奇妙冒险

#数据人的面试交流地##数据仓库与数据分析实习#
大数据从入门到放弃 文章被收录于专栏

写点大数据相关的内容,一起交流进步

全部评论
终于看明年拉链表了
点赞 回复 分享
发布于 2023-09-25 20:08 北京
涨知识了,之前没听过拉链表
点赞 回复 分享
发布于 2023-03-30 22:03 重庆

相关推荐

一面(4-7):--大数据相关内容--    拷打用SparkSQL迭代计算的合作项目(常规问题:如你负责哪一部分,做什么内容,难点是什么,价值点在哪里)    Spark和MR区别    Spark宽窄依赖,DAG流程图    Spark和Hive对数据倾斜的处理    Hadoop指的是什么(狭义,广义上来答)    你还用过哪些大数据组件(sqoop,presto,zookeeper)    sqoop用来做什么    presto和Spark的区别是什么    zookeeper干什么用(高可用,不过我只知道理论基础,这一块实操我不负责)    维度建模和范式建模的区别(面向分析和面向事务,一个为了分析可以接受冗余,另一个则尽量拆分表直到没有冗余)    --之后就偏离大数据,侧重于基础知识的考察--    数据库的索引(不会,g)    数据库设计一个图书管理系统,用范式建模理论,要有哪些表和字段(很久之前的课设,所以答得很一般)    http和https(久远的知识,只答了一个后者比前者更安全)    tcp三次握手(有点印象,草草讲了一下)    tcp和udp区别(大二学的,忘完了,g)    数组和链表(简单讲了一下存储地址与增删改查的时间复杂度)--算法--    二分查找(ez)    --sql--    1.统计每个用户每天每种支付方式的总金额(没有数据,只有字段,愣了一下之后解决了)        user_id        pay_method(有两种支付方式)        date        count    2.连续三天登录(sql中经典的难题,但做法死板,多做几遍就会了)--面试官解释--    实习侧重综合能力,所以问了很多大数据之外的内容,这点和秋招有一定差别二面(4-9):--大数据相关内容--    拷打数仓构建的学习项目    数据仓库为什么分层    数据仓库怎么分层(结合项目讲)    数据仓库分层后每一层的作用(结合项目讲)    缓慢渐变维怎么处理(SCD1,SCD2,SCD3)    SCD2好处,弊端(保留历史数据的同时更新数据,数据冗余比较多(但面试官一直追问还有吗....榨不出来了啊))    拉链表具体怎么做,end_date有什么用    hql怎么翻译成MR程序的(偷面经背了一下)    MR流程详解(看过好多版本的MR流程,挑了一个背了)    select ... from t1 join t2 group by ...  这个SQL执行,要运行几个MR(不会,跟面试官说是两个)    如果用了map join,上面的SQL运行几个MR(不会,跟面试官说是一个(因为mapjoin不用shuffle))    (这个问题后来研究应该都是跑两个MR,但是mapjoin实践检验太麻烦了,就没深究了)--其余知识--    现在我们正在进行的视频通话,用到哪些网络传输协议(一面结束把tcp和udp区别背了一下,于是乎答了个udp)    大学期间还学了那些课(就怕说漏嘴了后考我陈年老课)    读过哪些大数据相关书籍(大数据之路,还有一些阿里开发的规范文档)--算法--        大数相加(输入是很长的数字字符串)   --sql--    统计每天城市消费占比前十的用户和他们消费占区域总消费的多少(猪脑过载,逆天了)    用户表:        user_id        city_id        date        product_id        count    区域表        city_id        area_namehr面(4-14): --常规问题--    为什么放弃深造    你对在北京工作的看法    职业规划    你给你前两轮面试打几分,为什么    你为面试字节做了什么准备    你对我们部门了解多少    没有工作经验,怎么适应公司业务    工作后你要怎么尽快适应环境oc(4-17)--------------------------------------面经到此为止,后面是一些求职感想----------------------------------------------------历程--求职本就是一个运气和实力交织的过程,这次面试凭借自身发挥和一定运气拿下offer了,但3-4月背后也有很多失败腾讯面五挂四(传奇耐挂王)    京东面二挂二    百度挂    美团挂    快手挂    字节hr面挂(挂了之后复活赛打赢了)阿里系(阿里云,携程,陶天,饿了么等)万兴,360 ...  笔试就挂了...往好的方向想,做最坏的打算。该干嘛干嘛就可以了,太注重失败就没心思学习了(而且很多kpi面没必要内耗)。希望每个人都可以得到心仪的工作,希望努力的人都有光明的未来
点赞 评论 收藏
分享
在牛客上了看了好多佬的面经,确实给自己提供了帮助,再次感谢佬们的面经!我把自己面试的经历也分享给牛友,祝大家都拿到自己想要的offer!# 面试复盘## BG双非本+末流211硕+无竞赛+无实习+只有实验室的项目经历## 面经### 腾讯---软开-java#### 一面凉经 3/18​面试官没有开摄像头,maybe是kpi面,这也是我的第一次面试,整体表现巨差无比,给我留下了深深的打击,觉得自己就是个小废物。​上来经典的自我介绍,然后面试官就问我项目中的难点是什么,也没有追问。接下来就是提问环节​Q1:Mysql和Redis的区别?---->个人怎么用的Redis?​Q2:为什么用kafka?---->kafka重复消费怎么解决?​Q3:进程、线程、协程的区别。(我是菜鸡,没有复习到协程,丢死人了。)​Q4:讲一下对策略的理解​Q5:三道算法题:1、字符串相乘 ---->2、LRU---->3、乘积最大子数组(基本都是leetcode上的热门题目,但是我没有写出lru,让我深深的知道自己准备的是有多么的不足了,惨痛的经历,我是菜狗啊啊啊啊啊啊啊)​Q6:TCP和UDP的区别,估计是我回答的逻辑不好,就没有追问了​Q7:三次握手以及其中的细节,比如第二次握手失败会发生什么。然后就没有再问了,哭死,面试官很温柔但奈何不了我太菜了。第一次面试的紧张,我在写代码的时候既然在考虑输入输出,在面试官面前改输入输出的函数,第一次给了鹅,我太不珍惜了。### 快手---软开-java#### 一面凉经 3/19这次的面试官开了摄像头,我回答不上来的还会给我讲解,告诉我答案,在挂掉之后我也没了自信。经典自我介绍开头+项目中的难点。Q1:索引以及一系列的追问,最后出了一道题select * from t where c>0 and b!=1 and d=2;问我如何设计索引。答案是联合索引(d,c,b,a)Q2:乐观锁 和 悲观锁 。CAS的实现原理Q3:内存溢出和资源爆炸,讲一下自己经历过的内存溢出和资源爆炸Q4:kafka如何实现顺序消费还有一些关于日常使用的追问Q5:进程的并发执行问题,以及常用的锁。出了个题,讲一件i++如何实现上锁Q6:websocket如何实现通信,要提到sessionQ7:手撕:n个骰子投出为k的概率。这次面试对我打击巨大,面试官说我基础不好,要加强一下自己对基础知识的理解。也彻底没了自信,坐实了自己菜狗的身份。### 美团 ----软开-数开没错。这次岗位跟之前不太一样,我投错了,就是那么的sb,哎,硬着头皮面的。#### 一面 3/27经典的自我介绍,但是没有问项目中的难点。让我讲了将项目具体是做什么的,我巴拉巴拉的介绍了一遍。然后问我学过sql没,我信誓旦旦的说学过,平常经常用,然后一道sql手撕+算法就来了。sql手撕: employee表,找出只有五个直接下属的经理```sqlSELECT e.nameFROM employee eJOIN employee sub ON e.id = sub.managerIdGROUP BY e.id, e.nameHAVING COUNT(*) >= 5;```算法手撕:划分字符串,尽可能多的划分,同一字母最多出现在同一个片段中然后问了我听过事务没,我说听过,让我讲一下事务的特性。然后就没然后了,就让我反问了,我都感觉是kpi了,惊喜的是第二天发二面通知了。#### 二面 3/31自我介绍,然后上来就说我们考察代码能力的,直接扔出来一道题“K个一组链表翻转”,秒了。然后他看我做的太快,说再来一道吧,“合并区间”依旧秒了,都是hot100的题。然后他说我能把题背下来也是能力,我说我最近在经常刷题。然后就是八股拷打Q1:虚拟内存是什么 虚拟内存的实现 虚拟内存遇到空间不够了怎么办,虚拟内存会把资源存在哪里? 内存不够了怎么办Q2:tcp 如何保证稳定,详细讲一下保证稳定的机制,我讲的是超时重传。syn是什么,有什么用Q3:CAS(没错又问到了cas,这次哥们确实会了)Q4:线程切换Q5:索引,考了我最左匹配原则Q6:聊到了项目,我介绍了项目具体是做什么的,我自己的负责的内容,以及项目中的人员分工Q7:问我为什么选择这个方向,之前没有做过(我不敢说是我选错了,我说出于热爱和好奇,哭死)Q8:聊到了海量数据压缩,我从深度学习和算法的角度分别介绍了一下,没办法撞到了哥们擅长的领域Q8:聊到了AI,讲了讲我是如何使用ai的,以及对ai的看法。ai大势所趋这次面了70分钟左右,最开始我感觉面试官对我是无感的,但是我也尽力的去回答每一个问题,有答的好的答的不好的。面试过程中,面试官说了一句话“你是有自己的理解的。”所以我觉得在面试中还是要尽情的展示一下自己,让面试官感受到你的优点和激情。#### 4/1面试官通知二面结果,后续有人跟我联系#### 4/6号hr电话oc#### 4/9号offer## 感悟运气很重要,但是运气是留给有准备的人的。自己没有把握住鹅厂的面试,痛啊,刻在心里的痛啊。快手的打击让我彻底丧失了自信,陷入自我怀疑,从头又看了一遍八股,牛客上刷面经。java后端开发异常的卷,在面完数据开发之后有着深深的感受,大家在选择职位的时候可以酌情考虑吧。我确实卷不动。个人的简历过不了阿里、字节、蚂蚁、饿了么、京东、oppo、vivo、滴滴、作业帮等等的初筛,连面试都约不上,个人条件确实很有限。美团太好了,我是团孝子,我爱喝开水,我爱说实话。## 建议1、手撕,hoot100必刷,必刷,必刷,重要的事情说三遍。尤其是动态规划,贪心。面试的时候如果是模板题写不出来基本就凉凉了。2、简历上列出来的东西要能和面试官聊下去,面试官会看着简历问问题。3、面试的时候不要紧张,不用因为某个问题回答不上来就毁自己的状态。而是要尽情的展示自己,从思维上,情绪,性格上等等方面,万一有哪个点打动面试官就成了。4、运气是留给有准备的人的,还是要从自身出发,踏实准备,面的越多就会面的越多。5、合理评估自己准备的情况,java软开卷不动就卷数开,测开,前端,程序员是互通的,不要被语言,前后端限制住了,我们具备的是在这个领域如何快速学习的能力,而不是一门java语言学到死。6、八股是枯燥的,在回答八股的时候要用自己的话说出来,最好结合自己做过的项目,而不是背诵,要给面试官一种错觉,这个问题我在项目中思考过,而不是在八股文里背过。7、面试前在牛客上找对应岗位的面经,把面经里的问题都过一遍,最好再做点问题发散。
查看28道真题和解析
点赞 评论 收藏
分享
评论
6
22
分享

创作者周榜

更多
牛客网
牛客企业服务