拉链表的概念设计与实现

2024-02-20 07:20
文章标签 实现 拉链 概念设计

本文主要是介绍拉链表的概念设计与实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

拉链表

一、概念

拉链表是针对数据仓库设计中表存储数据的方式而定义的,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。

用处: 解决持续增长且存在一定时间时间范围内重复的数据
场景: 数据规模庞大,新数据【在有限的时间】内存在多种状态变化
原来解决方案: 采用分区表,用户分区存储历史增量数据,缺点是重复数据太多
优点: 节约空间

二、拉链表的设计

以订单为例:

普通表存每天数据

order_id bigint,			-- 订单id
user_id bigint,				-- 订单创建时间 
order_modify_dt timestamp,	--状态更改时间 
order_money decimal(10,2),	--订单价格 
current_status int			--订单状态

每次存储某一天数据

拉链(分区分桶表)

order_id bigint,
user_id bigint,
order_create_dt timestamp,
order_modify_dt timestamp,
order_money decimal(10,2),
current_status int

将初始数据装如拉链表

用某一天部分数据更新拉链表,新订单生成,旧订单修改

三、拉链表的实现

创建普通表存原始数据

create table hive_zipper_order(order_id bigint,user_id bigint,order_modify_dt timestamp,order_money decimal(10,2),current_status int
)
row format delimited fields terminated by ',';
// 将数据文件导入原始表格
load data local inpath '/root/data/order_record.log'
overwrite into table hive_zipper_order;

创建拉链表

//操作历史全量数据用动态分区
set hive.support.concurrency=true;  			-- hive支持
set hive.enforce.bucketing=true;				-- hive强制分桶
set hive.exec.dynamic.partition.mode=nonstrict; --动态分区 分区表 	给首次将大量数据导入使用
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; --事务管理器 
set hive.compactor.initiator.on=true; 			-- 表合并开启
set hive.compactor.worker.threads=1; 			-- 表合并线程必须为一
set hive.auto.convert.join=false;			 	-- 关闭 mapjoin,只能是reducejoin
set hive.merge.cardinality.check=false; 		-- 关闭检查数据列的基数(列值的差异性)
// 创建拉链表
drop table if exists hive_zipper_pc_order;
create table hive_zipper_pc_order(order_id bigint,user_id bigint,order_create_dt timestamp,order_modify_dt timestamp,order_money decimal(10,2),current_status int
) partitioned by(year int,month int,day int)
clustered by(order_create_dt) into 4 buckets
row format delimited fields terminated by ','
stored as orc tblproperties("transactional"="true");

开启动态分区,一次性挂载

// 对拉链表的数据进行聚合,获取订单信息的创建日期、修改日期和订单状态
with zip_src as (select order_id,user_id,order_money,min(order_modify_dt) as order_create_dt,max(order_modify_dt) as order_modify_dt,max(current_status) as current_statusfrom hive_zipper_ordergroup by order_id,user_id,order_money
)
// 将原始数据灌入拉链表
insert overwrite table hive_zipper_pc_order partition(year,month,day)
select order_id,user_id,order_create_dt,order_modify_dt,order_money,current_status,year(order_create_dt) as year,month(order_create_dt) as month,day(order_create_dt) as day
from zip_src;

拉链表查询

// 拉链表查询 查询之前必须先有这两句配置
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.support.concurrency=true;
select * from hive_zipper_pc_order
where to_date(order_modify_dt)='2021-02-04'
order by order_modify_dt desc;

之后每天,增量添加

// 对于追加增量数据,将增量数据覆盖在原始数据表中
load data local inpath '/root/data/order_record_2021_02_05.log'
overwrite into table hive_zipper_order;

拉链处理增量数据(新增新数据,修改旧数据)

// 将原始数据表中的增量数据插入拉链表
// 利用源数据和目标表的order_id进行匹配,若匹配则更新现有订单信息,若不匹配则插入新订单
merge into hive_zipper_pc_order as O
using (select order_id,user_id,order_create_dt,order_modify_dt,order_money,current_status,year(order_create_dt) as year,month(order_create_dt) as month,day(order_create_dt) as dayfrom (select order_id,user_id,order_money,min(order_modify_dt) as order_create_dt,max(order_modify_dt) as order_modify_dt,max(current_status) as current_statusfrom hive_zipper_order--where to_date(order_modify_dt)='2021-02-05'group by order_id,user_id,order_money)T
) as H
on O.order_id=H.order_id
when matched then 
update set order_modify_dt=H.order_modify_dt,current_status=H.current_status
when not matched then 
insert values(H.order_id,H.user_id,H.order_create_dt,H.order_modify_dt,H.order_money,H.current_status,H.year,H.month,H.day);

验证拉链结果

select * from hive_zipper_pc_order
where to_date(order_modify_dt)>to_date(order_create_dt);

数据仓库_缓慢渐变维_拉链表(全揭秘)_拉链表中的代理主键-CSDN博客

拉链表_什么是拉链表-CSDN博客

这篇关于拉链表的概念设计与实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/727433

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机