当前位置: 首页 > news >正文

【sql学习之拉链表】

1.拉链表理解

记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。
在这里插入图片描述
字段说明:

start_dt:该条记录的生命周期开始时间
end_dt:该条记录的生命周期结束时间
end_dt=’9999/12/31’表示该条记录目前处于有效状态
如果查询当前所有有效记录,select * from table where end_date=’9999/12/31’
如果查询2021/10/22的历史快照,select * from table where start_dt <=’2021/10/22’ and end_dt >=’2021/10/22’

2021/10/22的历史快照:
在这里插入图片描述

2. 拉链表实现方式

以在hive中为例(hive表一般只能进行删除和添加操作,不能进行update)
需要确定拉链表的时间粒度,比如拉链表每天只取一个状态,那如果一天中有3个状态变更,只取最后一个状态。

2.1 需要的信息

① 数据源信息:
数据全量信息,需要用来初始化;
② 每日更新信息(在分区表中添加更新标识字段或创建每日的更新数据表)
每日更新信息的获取方式:
在每日切片数据基础上,取第二天数据与前一天的不同数据,标记为更新。如何比较不同,可对所有字段先进行concat,取其md5进行比较,md5值不相等时,说明有更新。(hive环境需配置md5.jar包)
(取两天的切片数据,以md5字段做关联(full join),若第二天数据的md5不为空,说明为最新生效树,否则为失效数据。)
在这里插入图片描述
达到的效果:
对数据生效状态进行标记(生效/失效),删除及修改前数据为“失效”,新增及修改后数据为“生效”


数据变更形式:
数据不变、数据新增、数据删除、数据修改(修改=删除➡新增)
若要找出具体状态,可以用编码字段做关键字段关联(一般编码字段不会进行修改)
在这里插入图片描述
(取两天的切片数据,以编码字段做关联(full join),结合编码和md5判断数据变更形式)

2.2 添加标识字段(以编码字段关联)

①查看2021/10/24日数据
在这里插入图片描述
② 2021/10/25日数据
在这里插入图片描述
③ 两个分区日期对比下,在新一日数据中添加变更标识
1:删除,2:新增,3:修改,0:不变
在这里插入图片描述
实现方式:
在这里插入图片描述
① 前后两个分区日期的数据对比
② 使用full join (Mysql不支持,hive支持)
③ 关联字段为编码obj_cd,在标识数据变更状态时,进行全字段比较,这里是用concat函数将字段全部合并,生产环境中,一个表可能有几十或几百个字段,合并后的字符串长度会比较长。可以使用Md5函数,将长字符串转化为36位编码。(hive中需导入Md5函数的jar包)

2.3 根据标识字段,创建拉链表

① 首先历史信息存在
历史数据,其启用时间为2021/10/24,结束时间9999/12/31
在这里插入图片描述
② 根据变更标识字段,最新一日的更新信息为:
在这里插入图片描述
③ 将更新数据与历史数据做关联,更新拉链表起止时间,并追加新数据:
在这里插入图片描述
实现方式:
在这里插入图片描述
① 在历史数据中标记有变更的数据,更新结束时间end_dt
② 拼接更新数据(修改后数据 + 新增)

http://www.dtcms.com/a/277329.html

相关文章:

  • 【LLM-Agent】Qwen-Agent智能体框架使用
  • trySend、Channel 和 Flow 的工作原理
  • 【CMake】CMake创建、安装、使用静态库和动态库
  • 操作系统-第四章存储器管理和第五章设备管理-知识点整理(知识点学习 / 期末复习 / 面试 / 笔试)
  • 【hivesql 已知维度父子关系加工层级表】
  • C++每日刷题day2025.7.13
  • 什么是RAG(Retrieval-Augmented Generation)?一文读懂检索增强生成
  • RabbitMQ面试精讲 Day 2:RabbitMQ工作模型与消息流转
  • 12.I/O复用
  • 前端性能与可靠性工程:资源优化 - 加载性能的“低垂果实”
  • 从零开始学习深度学习-水果分类之PyQt5App
  • SpringBoot集成Redis、SpringCache
  • C++ 强制类型转换
  • 【操作系统】strace 跟踪系统调用(一)
  • (LeetCode 每日一题) 2410. 运动员和训练师的最大匹配数(排序、双指针)
  • es里为什么node和shard不是一对一的关系
  • Augment AI 0.502.0版本深度解析:Task、Guidelines、Memory三大核心功能实战指南
  • 将 NumPy 数组展平并转换为 Python 列表
  • 1.1.5 模块与包——AI教你学Django
  • OpenLayers 入门指南【二】:坐标系与投影转换
  • 把 DNA 当 PCIe:一条 365 nt 链实现 64 Gbps 片上光互连——基于链式 Förster 共振的分子级波分复用链路
  • 理解 Robots 协议:爬虫该遵守的“游戏规则”
  • MySQL逻辑删除与唯一索引冲突解决
  • M00224-小范围疫情防控元胞自动机模拟matlab
  • 【unitrix】 5.1 第二套类型级二进制数基本结构体(types2.rs)
  • 深入解析Hadoop架构设计:原理、组件与应用
  • OpenLayers使用
  • (2)从零开发 Chrome 插件:实现 API 登录与本地存储功能
  • 音视频学习(三十八):像素与位深
  • 打破并发瓶颈:虚拟线程实现详解与传统线程模型的性能对比