Hive拉链表
创始人
2024-05-29 21:51:39
0

概述

拉链表:维护历史状态以及最新状态数据的表

作用场景

1. 数据量比较大。

2. 表中的部分字段会被更新,比如用户的地址,银行利率,订单的状态等。

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

4. 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右。

5. 如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费;拉链历史表,既能满足反应数据的历史状态,又可以最大程度的节省存储。

链表的更新

假设以天为维度,以每天的最后一个状态为当天的最终状态。以一张订单表为例,如下是原始数据,2023/03/03 的订单状态明细

1       2023-03-03      2023-03-03      创建
2       2023-03-03      2023-03-03      创建
3       2023-03-03      2023-03-03      创建

建表并全量更新

create external table if not exists orders
(orderid      int,createdate   string,modifiedtime string,status       string)row format delimited fields terminated by '\t'location '/tmp/lalian/orders';create table ods_orders_inc
(orderid      int,createdate   string,modifiedtime string,status       string
) partitioned by (day string)row format delimited fields terminated by '\t';insert overwrite table ods_orders_inc partition (day = '2023-03-03')
select orderid, createdate, modifiedtime, status
from orders;create table dws_orders_his
(orderid      int,createdate   string,modifiedtime string,status       string,start_time   string,end_time     string
)row format delimited fields terminated by '\t';insert overwrite table dws_orders_his
select orderid, createdate, modifiedtime, status, modifiedtime, '9999-12-31'
from ods_orders_inc
where day = '2023-03-03';

如下结果 

 2023/03/04 的订单状态明细

1       2023-03-03      2023-03-03      创建
2       2023-03-03      2023-03-03      创建
3       2023-03-03      2023-03-03      创建
1       2023-03-03      2023-03-04      支付
2       2023-03-03      2023-03-04      支付
4       2023-03-04      2023-03-04      创建

增量更新

insert overwrite table ods_orders_inc partition (day = '2023-03-04')
select orderid, createdate, modifiedtime, status
from orders
where modifiedtime = '2023-03-04';insert overwrite table dws_orders_his
select *
from ((select orderid, createdate, modifiedtime, status, modifiedtime start_time, '9999-12-31' end_timefrom ods_orders_incwhere day = '2023-03-04')union all(select t1.orderid,t1.createdate,t1.modifiedtime,t1.status,t1.start_time,`if`(t2.orderid is not null and t1.end_time > '2023-03-04', '2023-03-04', t1.end_time) end_timefrom dws_orders_his t1left join (select orderid, modifiedtime from ods_orders_inc where day = '2023-03-04') t2on t1.orderid = t2.orderid)) tb1
order by tb1.orderid, tb1.modifiedtime;

 结果如下

  2023/03/05 的订单状态明细

1       2023-03-03      2023-03-03      创建
2       2023-03-03      2023-03-03      创建
3       2023-03-03      2023-03-03      创建
1       2023-03-03      2023-03-04      支付
2       2023-03-03      2023-03-04      支付
4       2023-03-04      2023-03-04      创建
1       2023-03-03      2023-03-05      完成
3       2023-03-03      2023-03-05      支付
4       2023-03-04      2023-03-05      支付
5       2023-03-05      2023-03-05      创建

 增量更新

insert overwrite table ods_orders_inc partition (day = '2023-03-05')
select orderid,createdate,modifiedtime,status
from orders
where modifiedtime = '2023-03-05'or (createdate = '2023-03-05' and modifiedtime = '2023-03-05');insert overwrite table dws_orders_his
select *
from ((select orderid, createdate, modifiedtime, status, modifiedtime start_time, '9999-12-31' end_timefrom ods_orders_incwhere day = '2023-03-05')union all(select t1.orderid,t1.createdate,t1.modifiedtime,t1.status,t1.start_time,`if`(t2.orderid is not null and t1.end_time > '2023-03-05', '2023-03-05', t1.end_time) end_timefrom dws_orders_his t1left join (select orderid, modifiedtime from ods_orders_inc where day = '2023-03-05') t2on t1.orderid = t2.orderid)) tb1
order by tb1.orderid, tb1.modifiedtime;

 结果如下

相关内容

热门资讯

催收人员泄露用户欠款信息是否侵...   冯佳敏  案情回顾  张某在某信用卡中心申领了一张信用卡,后张某出现信用卡逾期还款情况。在拨打其...
大唐西市(00620.HK)拟... 格隆汇7月9日丨大唐西市(00620.HK)发布公告,2025年7月8日,公司与配售代理(即昌利证券...
杰夫・贝佐斯出售6.66亿美元... 杰夫・贝佐斯  一份监管文件于周二显示,亚马逊创始人杰夫・贝佐斯在 7 月的两天内出售了近 300 ...
美国关税暂缓90天的“得与失” 【环球时报特约记者 任重 环球时报记者 杨舒宇 倪浩】7月9日美国“对等关税”政策暂缓期到期在即,美...
落实“塔长制” 筑牢通信防线(...   随着主汛期来临,风雨考验在即。安徽阜阳铁塔严格落实“塔长制”要求,全力筑牢通信保障防线。按照“塔...
NASA依赖加深,SpaceX... 【环球时报综合报道】相比五角大楼或多或少还能找到几个SpaceX的“替补者”,美国国家航空航天局(N...
司法行政领域代表与中外记者见面... 经济日报北京7月8日讯(记者刘亮)在国新办举办的“新征程上的奋斗者”中外记者见面会上,5位来自司法行...
特朗普:韩国应自行支付国防费用 格隆汇7月9日|据央视,当地时间8日,美国总统特朗普在白宫内阁会议上表示,韩国应该自行支付军事防卫费...
阳宗海风景区开展应急演练模拟处...   本报讯 记者王琳报道 近日,昆明阳宗海风景名胜区在施家咀湿地开展旅游行业突发事件处置应急演练,进...
从“技术验证”转向“场景落地”... 日前,一辆特斯拉新车自己通过FSD(完全自动驾驶),找到车主完成交付;中国的无人驾驶汽车则在中东的道...