拉链表(SCD2)的操作
什么时候使用拉链表?
当数据存在有变更的情况时,可以采用渐变维(SCD)模型来解决。这里推荐使用SCD2拉链 表。拉链表既可以反应数据的历史状态,又能在最大程度上节省存储。 拉链表的实现需要在原始字段基础上增加两个新字段:
- start_date(表示该条记录的生命周期开始时间——周期快照时的状态)
- end_date(该条记录的生命周期结束时间)
拉链表插入数据流程
ODS抽取新增/变更数据;
重建临时表tmp;
合并昨日增量数据(ods表)与历史数据(拉链表)到临时表
(1) 新数据(员工)end_date设为‘9999-99-99’,也就是当前有效;
(2) 如果增量数据有重复id的旧数据(未离职老员工),将旧数据end_date(退休日期)更新为前天(昨天-1),也就是从昨天开始不再生效;
(3) 合并后的数据写入tmp表;
将临时表的数据,覆盖到拉链表中;
第二天再次循环。
合并新旧数据的完整代码
- 新数据☞:导入数据时间的前一天更新的和新增的数据
- 旧数据☞:导入数据时间的昨天的昨天不再发生变化的数据
insert overwrite table yp_dwd.fact_shop_order_tmp partition (start_date)
select *
from (-- 一、ods表的新数据select id,order_num,buyer_id,store_id,-- 转换case order_fromwhen 1 then 'android'when 2 then 'ios'when 3 then 'miniapp'when 4 then 'pcweb'else 'other' end as order_from,order_state,create_date,finnshed_time,is_settlement,is_delete,evaluation_state,way,is_stock_up,create_user,create_time,update_user,update_time,is_valid,'9999-99-99' end_date,'${TD_DATE}' as start_datefrom yp_ods.t_shop_order-- 过滤where dt = '${TD_DATE}'and id is not nulland buyer_id is not nulland store_id is not nulland create_date is not null
union all
-- 二、历史拉链表数据,并根据up_id判断更新end_time有效期
select fso.id,fso.order_num,fso.buyer_id,fso.store_id,fso.order_from,fso.order_state,fso.create_date,fso.finnshed_time,fso.is_settlement,fso.is_delete,fso.evaluation_state,fso.way,fso.is_stock_up,fso.create_user,fso.create_time,fso.update_user,fso.update_time,fso.is_valid,-- 3、更新end_time:如果没有匹配到变更数据,或者当前已经是无效的历史数据,则保留原始end_time过期时间; 否则变更end_time时间为前天(昨天之前有效)if(up.id is null or fso.end_date < '9999-99-99', fso.end_date, date_add(up.dt, -1)) end_date,fso.start_date
from yp_dwd.fact_shop_order fsoleft join (select * from yp_ods.t_shop_order where dt = '${TD_DATE}') upon fso.id = up.id
-- 4、时间限制:如果订单的变更周期是30天则可加上此条件,结果会按照所属分区进行覆盖插入
-- where fso.start_date >= date_add(up.dt, -30)
) his
order by his.id, start_date;
合并数据时的left join的作用
拉链表(SCD2)的操作相关推荐
- 意向客户主题看板 阿善有用 前边有用后面没用 拉链表
今日内容:1) 分桶表的相关优化 -- 理解2) 建模分层操作 -- 需要操作3) 全量流程的统计分析: -- 需求操作 (尝试自己实现) 数据的采集, 数据的清洗转换, 数据维度退化, 数据的统计分 ...
- DataBase 之 拉链表结构设计
一.概念 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 在历史表中对客户的一生的记录可能就这样几条记录,避 ...
- update 两个表关联_拉链表(二)
拉链表(一) 拉链表(二) 一.前言 在上一节简单介绍了拉链表,本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表. 这里以上节介绍的用户表(user) 举例 二.涉及到 ...
- 单张表超过30个字段_拉链表
为什么要做拉链表 拉链表适合于:数据会发生新增和变化,但是大部分是不变的,且是缓慢变化的(如电商中用户信息表中的手机号不可能每天都变化),如果是快速变化的(如每天一变),则每天做全量更新(事务型事实表 ...
- hive增量表和全量表_hive 拉链表 实现全量数据 增量更新
背景: 数据表字段有IP,IP省份,IP城市,最新访问时间,假如目前一共有100W的IP我第一次初始化的时候完成初始化表插入,然后每天都有5W左右的IP活跃,然后我要更新这5W个IP的记录到初始化的表 ...
- 2清空所有表_拉链表(二)
拉链表(一) 拉链表(二) 一.前言 在上一节简单介绍了拉链表,本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表. 这里以上节介绍的用户表(user) 举例 二.涉及到 ...
- 现在银行etl还要做拉链表吗_hive 拉链表 实现全量数据 增量更新
背景: 数据表字段有IP,IP省份,IP城市,最新访问时间,假如目前一共有100W的IP我第一次初始化的时候完成初始化表插入,然后每天都有5W左右的IP活跃,然后我要更新这5W个IP的记录到初始化的表 ...
- hive中实现行转列_漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)
全文由下面几个部分组成: 先分享一下拉链表的用途.什么是拉链表. 通过一些小的使用场景来对拉链表做近一步的阐释,以及拉链表和常用的切片表的区别. 举一个具体的应用场景,来设计并实现一份拉链表,最后并通 ...
- 【clickhouse】数据仓库中的拉链表(Clickhouse 实现)
文章目录 1.概述 在 Clickhouse 中实现拉链表 一. 每日的用户更新表: 二. ods 层的 user 表: ods 层的 user_update 表 拉链表: 拉链表和流水表: 查询性能 ...
最新文章
- CoinMarketCap计划于11月发布新的流动性排名系统
- 常见虚拟主机目录对照及星外提权目录
- html封装windows,windows 系统封装,打造一份属于自己的系统!
- Cloud一分钟 | 一脚踏入云计算2.0时代,京东云这回拼的是“朋友 圈”;8400万元私有云招标...
- 图片复印如何去除黑底_身份证复印机中间有黑线怎么办
- CFNetwork 框架详细解析
- 实验1 查看cpu和内存,用机器指令和汇编指令编程
- IAR使用技巧 之 快捷键批量更换指定字符(以及Keil的全局替换功能)
- IDEA怎么设置背景图片
- NSGA_2总结梳理附代码按行详细注解
- 个别海康摄像机通过国标GB28181接入EasyCVR,视频无法打开的解决办法
- magick++配置
- UINO优锘:数据中心可视化管理面向运营的IT运维配置管理
- 医学影像分割论文合集
- c#的decode用法
- 微信小程序:WeUI一个专为微信小程序设计的UI框架
- 在linux系统下忘记了root密码,在linux系统下,忘记了root密码,可以到()模式下修改找回root密码()...
- UG/NX 二次开发(C#)自动出2D零件图思路
- active英语怎么读音_inactive,inactive的英文意思和翻译,inactive的音标读音,用法,例句,发音,含义讲解...
- Charles 限制网络速度(Throttle设置)
热门文章
- 余弦相似性 Cosine-Similar
- 国产Excel开发组件Spire.XLS【转换】教程(14):如何在 C# 中将 Excel 工作表转换为 EMF 图像
- el-tabe单元格合并
- CST仿真指导 | 参数寻优问题求解——Parameter Sweep、Optimization
- Brave Song
- 如何用Pact进行微服务集成测试(二)
- python 怎么输入字符上的横线_python 怎么输入字符上的横线_字符上方的横线怎么用MathType编辑...
- Linux 让普通用户拥有root的权限
- sqlmap之tamper的使用介绍
- FL Studio 21中文永久版网盘下载(含Key.reg注册表补丁)