Hive 之拉链表

news/2024/7/7 19:55:52

文章目录

    • 什么是拉链表?
    • 如何实现拉链?
    • 拉链表实现示例

什么是拉链表?

一张存储历史数据的表,记录数据由 “生” 到 “死” 的过程,用于处理缓慢变化维。

好处是拉链表可以保存每条数据的所有历史记录,轨迹十分清晰。

如何实现拉链?

我们在拉链表中常常通过定义 start_timeend_time 这两个字段来记录数据当前是否还在有效期内

具体实现逻辑:

假如用户当前某个字段的值发生了变化,例如:昵称被用户修改了。我们需要进行下面两个操作。

新增数据:
此时便会产生一条新的数据,start_time 值为数据更新的时间,而 end_time 的值一般设为 9999-12-31(不过期的时间)。

过期数据:
我们需要将用户的上一条数据设置为过期状态,也就是说用户上一条数据的 end_time 字段的值应该被设置为新数据开始时间的上一秒,让它成为过去式。

通过为新增数据设置过期时间,为过期数据设置结束时间的方式,我们完成对数据的更新操作,同时还可以保存历史数据,这就是拉链表的作用。

拉链表实现示例

  1. 我们在 Hive 中 dwd 层创建拉链表,并插入示例数据。
create table if not exists dwd.dwd_zip(
id int, -- 主键
name string,
gender string,
addr string,
start_time string,
end_time string)
row format delimited fields terminated by '\t';

insert into dwd.dwd_zip values
(001,"zhangsan","男","上海","2022-10-20","9999-12-31"),
(002,"lisi","男","北京","2022-10-20","9999-12-31"),
(003,"wangwu","男","天津","2022-10-20","9999-12-31"),
(004,"laoqin","男","常德","2022-10-20","9999-12-31"),
(005,"zc","男","平江","2022-10-20","9999-12-31"),
(006,"lihua","男","长沙","2022-10-20","9999-12-31");

插入后数据如下所示:

在这里插入图片描述

  1. 我们在 Hive 中 ods 层设置增量表 update_zip,并插入示例数据。
create table if not exists ods.update_zip(
id int, -- 主键
name string,
gender string,
addr string,
start_time string,
end_time string)
row format delimited fields terminated by '\t';

insert into ods.update_zip values
(001,"张三","男","上海","2022-10-21","9999-12-31"),
(099,"wuziyi","女","武汉","2022-10-21","9999-12-31");

插入后数据如下所示:

在这里插入图片描述

  1. 在 ods 层中的增量表中可以看到我们修改了一行数据,增加了一行数据,现在我们通过拉链表的方式对其进行更新。

  2. 实现 SQL

create table dwd.tmp_zip as
select
  id,
  name,
  gender,
  addr,
  start_time,
  end_time
from
  ods.update_zip -- 增量表
union all -- 合并历史表
select
  a.id,
  a.name,
  a.gender,
  a.addr,
  a.start_time,
  if(b.id is null or a.end_time < '9999-12-31',a.end_time,date_sub(b.start_time,1)) end_time
from
  dwd.dwd_zip a -- 历史拉链表
left join
  ods.update_zip b -- 增量数据表
on
  a.id = b.id;

重点部分:

if(b.id is null or a.end_time < '9999-12-31',a.end_time,date_sub(b.start_time,1)) end_time

通过左连接判断是否新增或者该数据是否为历史记录(即:已经被设置为过期的数据)。

如果没有进行新增或为历史记录,就返回 end_time 原值。

否则就对原拉链表数据的结束时间进行修改,值为增量数据的开始时间减1,将它设置为过期状态。

最终结果如下所示:

在这里插入图片描述

拉链表通常情况下的粒度为天。


http://lihuaxi.xjx100.cn/news/170954.html

相关文章

【C++】string的使用

文章目录一、前言二、标准库中的string类三. string类的常用接口1. 构造函数2. 容量操作3. 访问遍历4. 修改操作5. 其他操作一、前言 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0…

Oracle表空间、用户详解

目录新建连接三者关系表空间创建表空间修改表空间和数据文件修改数据文件容量新增表空间的数据文件重命名数据文件修改表空间状态修改数据文件状态删除表空间查询用户创建删除查询修改新建连接 工具选择&#xff1a; 我们一般会选择一个工具来连接本地的Oracle&#xff0c;而我…

JavaEE——Servlet中的session

之前的博客中提到&#xff0c;cookie是为了浏览器能够在本地保存数据而产生的机制&#xff0c;是在浏览器工作的。而session则是与之对应的&#xff0c;在客户端工作的。一个服务器对应多个客户端&#xff0c;每个客户端都有自己的session&#xff0c;以sessionId为key&#xf…

2.19 emoji符号大全【玩赚小红书】

知乎无法显示全部表情符号&#xff0c;大家可以参考这个网站&#xff1a;&#x1f923; Emoji表情大全&#xff0c;颜文字百科 &#x1f48c; &#x1f603;&#x1f481;表情符号 &#x1f600; &#x1f603; &#x1f604; &#x1f601; &#x1f606; &#x1f605; &…

PySide创建界面关联项目(五) 百篇文章学PyQT

本文章是百篇文章学PyQT的第五篇&#xff0c;本文讲述如何使用PySide创建UI界面&#xff0c;并且关联入PyCharm 新建的项目中成功运行第一个PyQT程序&#xff0c;博主在本篇文章中将遇到和踩过的坑总结出来&#xff0c;可以供大家参考&#xff0c;希望大家安装顺利。包括 安装、…

STM32F407 电机编码器测量

文章目录一、STM32F407 定时器编码器功能1.1 STM32定时器简介1.2 STM32定时器编码器功能二、带编码器的直流电机三、代码与验证3.1 初始化代码3.2 验证一、STM32F407 定时器编码器功能 1.1 STM32定时器简介 STM32的定时器功能非常强大&#xff0c;根据官方手册&#xff0c;定…

[U3D ShaderGraph] 全面学习ShaderGraph节点 | 第一课 | 内置节点

欢迎 ShaderGraph是可视化的着色器编辑工具。您可以使用此工具以可视方式创建着色器,而不用编写代码。 本专栏可以让你更了解ShaderGraph中每个节点的功能,更自如的在做出自己想要的效果。 如果你想学习在unity中如何制作一个特效,如何在unity中让模型更炫酷,那么快来加入这…

基于Prometheus的容器云平台监控架构设计

【导读】为容器云提供良好的监控环境是保证容器服务的高可靠性、高可用性和高性能的重要部分,通过本文能够快速认识当前容器环境下都有哪些监控方案,并对主流的监控方案有一个系统的了解和认识,并详细介绍基于Prometheus的容器云平台监控架构设计。 1 概述 随着容器化的大…