Hive拉链表、快照表

拉链表

  拉链表记录一个事物从开始,一直到当前状态的所有变化的信息。可以使用这张表拿到最新的当天的最新数据以及之前的历史数据。
在这里插入图片描述
拉链表的使用场景
在数据仓库的数据模型设计过程中,经常会遇到下面这种表的设计:

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

针对以上表设计,拉链表满足既能获取最新的数据,也能添加筛选条件并获取历史的数据的要求。

在Hive中实现拉链表
  目前Hive的表只能进行删除和添加操作,而不能进行update。基于这个前提,我们来实现拉链表。在实现拉链表之前,需要先确定一下有哪些数据源可以用:
1、需要一张ODS层的用户全量表,需要用它来初始化
2、每日的用户更新表

而且还需要确定拉链表的时间粒度,比如说拉链表每天只取一个状态,也就是说如果一天有3个状态变更只取最后一个状态,这种天粒度的表其实已经能解决大部分的问题了。
  另外,对于每日的用户更新表该怎么获取,有以下方式拿到或者间接拿到每日的用户增量:

  1. 可以监听Mysql数据的变化,比如说用Canal,最后合并每日的变化,获取到最后的一个状态
  2. 假设每天都会获得一份切片数据,可以通过取两天切片数据的不同来作为每日更新表,这种情况下可以对所有的字段先进行concat,再取md5
  3. 流水表,有每日的变更流水表
  4. 通过etl工具对操作型数据库按照时间字段增量抽取到ods或者数据仓库(每天抽取前一天的数据),形成每天的增量数据(实际中使用最多的情形)。

拉链表实现方式一:
ods层的user表
ods层的用户资料切片表的结构:

CREATE EXTERNAL TABLE ods.user ( 
  user_num STRING COMMENT '用户编号', 
  mobile STRING COMMENT '手机号码', 
  reg_date STRING COMMENT '注册日期' 
COMMENT '用户资料表' 
PARTITIONED BY (dt string) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' 
STORED AS ORC 
LOCATION '/ods/user'; 
) 

ods层的use

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Hive是一个开源的数据仓库和查询工具,用于将大数据处理和分析集成在Hadoop生态系统中。拉链表是一种在Hive中实现的数据处理技术,主要用于处理维度数据的历史变化。 拉链表的实现思路是将每个维度根据指定的生效日期和失效日期进行拆分,生成多个对应不同时间段的维度数据,以保留维度的历史变化记录。在Hive中,可以通过以下步骤来实现拉链表: 1. 创建维度和事实:首先,创建维度和事实Hive。维度用于存储维度字段的详细信息,例如员工、产品等;事实用于存储与维度关联的度量数据,例如销售事实。 2. 设计拉链表结构:在维度中添加生效日期(start_date)和失效日期(end_date)字段,用于标识每条记录的有效时间段。通常,失效日期为空或未来日期示当前有效数据。 3. 插入初始数据:将初始数据插入维度,即没有历史记录的部分。在start_date字段中填写最早的日期,end_date字段中填写NULL或未来日期。 4. 插入新数据:当维度中的记录有更新或新增时,需要按照拉链表的原则进行插入。具体操作是将原有的生效日期字段(start_date)的end_date字段更新为当前日期,并将新数据插入到维度中。 5. 查询数据:在查询维度和事实时,可以通过使用日期条件和JOIN操作,将最近生效的维度数据关联到事实数据上,以获得正确的历史维度信息。 拉链表的实现使得Hive可以处理维度数据的历史变化情况,并提供了便捷的方式来查询和分析历史数据。它对于构建具有时间依赖性的报和分析非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值