一篇文章教会你数据仓库之详解拉链表怎么做!

一篇文章教会你数据仓库之详解拉链表怎么做!

==================================================

docx image

前言

先分享一下拉链表的用途、什么是拉链表。

通过一些小的使用场景来对拉链表做近一步的阐释,以及拉链表和常用的切片表的区别。

举一个具体的应用场景,来设计并实现一份拉链表,最后并通过一些例子说明如何使用我们设计的这张表(因为现在Hive的大规模使用,我们会以Hive场景下的设计为例)。

分析一下拉链表的优缺点,并对前面的提到的一些内容进行补充说明,比如说拉链表和流水表的区别。

docx image

什么是拉链表

docx image

拉链表的使用场景

有一些表的数据量很大,比如一张用户表,大约10亿条记录,50个字段,这种表,即使使用ORC压缩,单张表的存储也会超过100G,在HDFS使用双备份或者三备份的话就更大一些。

表中的部分字段会被update更新操作,如用户联系方式,产品的描述信息,订单的状态等等。

需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态。

表中的记录变化的比例和频率不是很大,比如,总共有10亿的用户,每天新增和发生变化的有200万左右,变化的比例占的很小。

方案一:每天只留最新的一份,比如我们每天用Sqoop抽取最新的一份全量数据到Hive中。

方案二:每天保留一份全量的切片数据。

方案三:使用拉链表。

为什么使用拉链表

拉表链的设计与实现

docx image

拉表链的设计与实现拉表链的设计与实现

如何设计一张拉链表

docx image

docx image

docx image

docx image

此处要好好理解,是拉链表比较重要的一块

在Hive中实现拉链表

我们需要一张ODS层的用户全量表。至少需要用它来初始化。

每日的用户更新表。

我们可以监听Mysql数据的变化,比如说用Canal,最后合并每日的变化,获取到最后的一个状态。

假设我们每天都会获得一份切片数据,我们可以通过取两天切片数据的不同来作为每日更新表,这种情况下我们可以对所有的字段先进行concat,再取md5,这样就ok了。

流水表!有每日的变更流水表。

ods层的user_update表

拉链表

实现sql语句

docx image

拉链表和流水表

查询性能

在一些查询引擎中,我们对start_date和end_date做索引,这样能提高不少性能。

保留部分历史数据,比如说我们一张表里面存放全量的拉链表数据,然后再对外暴露一张只提供近3个月数据的拉链表。

docx image

总结

使用拉链表的时候可以不加t_end_date,即失效日期,但是加上之后,能优化很多查询。

可以加上当前行状态标识,能快速定位到当前状态。

在拉链表的设计中可以加一些内容,因为我们每天保存一个状态,如果我们在这个状态里面加一个字段,比如如当天修改次数,那么拉链表的作用就会更大。

–END–

docx image

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容