热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

03-数据仓库之拉链表

1、拉链表:①记录每条信息的生命周期为单位②一旦一条记录的生命周期结束,就重新开始一条新的记录,并把当前日期作为此记录的生效日期③如果当前信息至今有效,在
1、拉链表:

      ①记录每条信息的生命周期为单位
      ②一旦一条记录的生命周期结束,就重新开始一条新的记录,并把当前日期作为此记录的生效日期
      ③如果当前信息至今有效,在生效结束日期中填入一个极大值(如9999-12-31、9999-99-99)

      用处:

        ①需要查看某些业务信息的某一个时间点当日的信息
        ②数据会发生变化,但是大部分是不变的。(无法做每日增量)
        ③数据量有一定的规模,无法按照每日全量的方法保存 。(无法做每日全量)

2、拉链表实例:

 

      现在增量数据从mysql 已经导入到ods层中了:ods_order_info。

      ①在dwd层中,新建dwd _order_info表,结构和ods_order_info一样,多了'start_date'、'end_date'两个字段

        drop table if exists dwd _order_info;
        create table dwd _order_info(

            ..........
            .........
          'start_date' string comment '有效开始日期',
          'end_date string comment '有效结束日期'
        )comment '订单拉链表'
        partioned by ('dt' string)                        //分区不是必要的
        stored as parquet                          //存储格式
        location '/warehouse/online_trade/dwd/dwd _order_info'
        tblproperties("parquet.compression"="snappy")            //压缩算法

        拓展一下分区:
          ①减小查询范围
          ②索引
          ③数据量巨大

          拉链表分区与不分区取决于数据量的多少,并且拉链表也不是每天做,可能是每周、每个月做也说不定!!!
          也就是说,按天分区、按月分区、不分区都是可以的!!

     ②将ods的增量数据导数据到dwd

        insert overwrite table dwd_order_info
        select
          .....
          '2019-01-10',                    //设置生效日期
          '9999-99-99'                     //有效结束日期
        from ods_order_info a where a.dt='2019-01-10'        //将ods的数据导进去

 

     ③现在dwd_order_info是最新的增量数据,dwd_order_info_his:是HDFS上的以前的拉链数据(历史表),结构和dwd_order_info一样

 

        新建一张dwd_order_info_tmp,结构和dwd_order_info一样:

        目的是将今天的增量数据,和历史数据合并。

            ①如果今天增量中某些记录,以前已经在历史表存在,那么对历史表进行更新,历史数据有效期设为今天-1

            ②经过上一步,历史表 = 今天没更新的数据 + 今天更新的数据但是有效期设为昨天(已过期) ,那么历史表dwd_order_info_his)    union all    最新的增量(dwd_order_info) =  最新的数据(dwd_order_info_tmp

        insert overwrite dwd_order_info_tmp
        select
          .......
          .......
          t1.start_date,
          if(t2.id is null,t1.end_date,date_add('2019-01-10',-1) )
          from dwd_order_info_his t1 left join dwd _order_info t2

          on t1.id = t2.id and t1.end_date='9999-99-99'               //确保join连接的是还未过期的历史数据,对已过期的历史数据不做连接

        where t2.dt = '2019-01-10'                          //确保增量数据是今天导入的。


        //以历史表为基表:t2.id is null 表示已过期的历史数据,那么有效结束日期不变
        // if is not null 表示历史数据中变化量,那么结束日期-1

        union all

        select * from dwd_order_info where dwd_order_info.dt = '2019-01-10'

        //如果今天增量中某些记录以前没记录,那么进行合并到dwd_order_info_tmp

 

      ④更新历史表

          insert overwrite dwd_order_info_his
          select ....... from dwd_order_info_tmp    

  

          注:不要用select *,强烈不推荐使用

 

3、拉链表中获取增量问题:

    如何获取mysql中的每日变动表?

      ①表中设计创建日期、变动日期字段,那么sqoop就能根据变动日期导数据!

      ②用canal监控mysql的实时变化

    

 


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • Hive的数据表创建数据文件inner_table.dat创建表hive>createtableinner_table(keystri ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了解决Facebook脸书面试题中插入区间的方法,通过模拟遍历的方式判断当前元素与要插入元素的关系,找到插入点并将新区间插入。同时对算法的时间复杂度和空间复杂度进行了分析。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • Hadoop 源码学习笔记(4)Hdfs 数据读写流程分析
    Hdfs的数据模型在对读写流程进行分析之前,我们需要先对Hdfs的数据模型有一个简单的认知。数据模型如上图所示,在NameNode中有一个唯一的FSDirectory类负责维护文件 ... [详细]
author-avatar
米字格时光
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有