什么时候使用拉链表?

当数据存在有变更的情况时,可以采用渐变维(SCD)模型来解决。这里推荐使用SCD2拉链 表。拉链表既可以反应数据的历史状态,又能在最大程度上节省存储。 拉链表的实现需要在原始字段基础上增加两个新字段:

  • start_date(表示该条记录的生命周期开始时间——周期快照时的状态)
  • end_date(该条记录的生命周期结束时间)

拉链表插入数据流程

  1. ODS抽取新增/变更数据;

  2. 重建临时表tmp;

  3. 合并昨日增量数据(ods表)与历史数据(拉链表)到临时表

    (1) 新数据(员工)end_date设为‘9999-99-99’,也就是当前有效;

    (2) 如果增量数据有重复id的旧数据(未离职老员工),将旧数据end_date(退休日期)更新为前天(昨天-1),也就是从昨天开始不再生效;

    (3) 合并后的数据写入tmp表;

  4. 将临时表的数据,覆盖到拉链表中;

  5. 第二天再次循环。

合并新旧数据的完整代码

  • 新数据☞:导入数据时间的前一天更新的和新增的数据
  • 旧数据☞:导入数据时间的昨天的昨天不再发生变化的数据
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. 意向客户主题看板 阿善有用 前边有用后面没用 拉链表

    今日内容:1) 分桶表的相关优化 -- 理解2) 建模分层操作 -- 需要操作3) 全量流程的统计分析: -- 需求操作 (尝试自己实现) 数据的采集, 数据的清洗转换, 数据维度退化, 数据的统计分 ...

  2. DataBase 之 拉链表结构设计

    一.概念 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 在历史表中对客户的一生的记录可能就这样几条记录,避 ...

  3. update 两个表关联_拉链表(二)

    拉链表(一) 拉链表(二) 一.前言 在上一节简单介绍了拉链表,本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表. 这里以上节介绍的用户表(user) 举例 二.涉及到 ...

  4. 单张表超过30个字段_拉链表

    为什么要做拉链表 拉链表适合于:数据会发生新增和变化,但是大部分是不变的,且是缓慢变化的(如电商中用户信息表中的手机号不可能每天都变化),如果是快速变化的(如每天一变),则每天做全量更新(事务型事实表 ...

  5. hive增量表和全量表_hive 拉链表 实现全量数据 增量更新

    背景: 数据表字段有IP,IP省份,IP城市,最新访问时间,假如目前一共有100W的IP我第一次初始化的时候完成初始化表插入,然后每天都有5W左右的IP活跃,然后我要更新这5W个IP的记录到初始化的表 ...

  6. 2清空所有表_拉链表(二)

    拉链表(一) 拉链表(二) 一.前言 在上一节简单介绍了拉链表,本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表. 这里以上节介绍的用户表(user) 举例 二.涉及到 ...

  7. 现在银行etl还要做拉链表吗_hive 拉链表 实现全量数据 增量更新

    背景: 数据表字段有IP,IP省份,IP城市,最新访问时间,假如目前一共有100W的IP我第一次初始化的时候完成初始化表插入,然后每天都有5W左右的IP活跃,然后我要更新这5W个IP的记录到初始化的表 ...

  8. hive中实现行转列_漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

    全文由下面几个部分组成: 先分享一下拉链表的用途.什么是拉链表. 通过一些小的使用场景来对拉链表做近一步的阐释,以及拉链表和常用的切片表的区别. 举一个具体的应用场景,来设计并实现一份拉链表,最后并通 ...

  9. 【clickhouse】数据仓库中的拉链表(Clickhouse 实现)

    文章目录 1.概述 在 Clickhouse 中实现拉链表 一. 每日的用户更新表: 二. ods 层的 user 表: ods 层的 user_update 表 拉链表: 拉链表和流水表: 查询性能 ...

最新文章

  1. 如何用初中知识理解机器学习到底在干什么事情
  2. .net里鼠标选中的text数据怎么获取_怎么利用Excel设置当天生日提醒功能
  3. [WP]关于WP7的后台的一些小事情
  4. 路由策略原理及配置请查收......
  5. Docker Compose部署项目到容器-基于Tomcat和mysql的项目yml配置文件代码
  6. e 签宝携手神策数据,数据赋能智能办公产品服务双升级
  7. 《JVM系列》深入浅出类加载机制中<init>和<Clinit>的区别【一篇即可搞懂初始化机制】
  8. Linux学习之系统编程篇:PCB( 进程控制块)、进程状态、转换和控制
  9. Android UI学习 - GridView和ImageView的使用
  10. android eclipse 配置 在项目右击选择properties
  11. 十二生肖swift1.2
  12. java 防御编程_用Java编程。实现两个人对决。有血量有防御。有攻击力
  13. Visio | 动画制作
  14. 欧姆龙r88d系列服务器说明书,欧姆龙R88D-KN10H-ECT-Z用户手册 - 广州凌控
  15. Python 毕设精品实战案例——快速索引目录Part2
  16. 传奇地图事件触发脚本
  17. 30天自制C++服务器
  18. 时间管理的十一条黄金定律
  19. 利用 HBuilderX 设置公司简介页面
  20. 极智硬件 | 国产CPU大荟萃 且听我一一道来

热门文章

  1. Cause: java.sql.SQLSyntaxErrorException: Unknown column
  2. 论文阅读 (65):RePaint: Inpainting using Denoising Diffusion Probabilistic Models
  3. _attribute用法总结
  4. easyExcel导入报错excelType
  5. 《锋利的 jQuery(第2版)》
  6. office 2010 ;密钥
  7. 神策军丨码农转产品,大厂来神策……4 个合肥技术人的勇敢求变之路
  8. echart自定义仪表盘样式
  9. 使用pytorch的loss.backward()时,出现element 0 of tensors does not require grad and does not have a grad_fn
  10. Linux应用开发-LCD显示BMP图片