热门标签 | 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的实时变化

    

 


推荐阅读
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • C# 中 SQLite 报错:在 "\\s\\" 附近出现语法错误,如何解决? ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 本文深入探讨了Hibernate框架中乐观锁和悲观锁的机制及其多态特性。乐观锁假设数据在大多数情况下不会发生冲突,因此在读取数据时不加锁,而是在更新时检查版本号以确保数据未被修改。相比之下,悲观锁则认为数据在并发环境下容易产生冲突,因此在读取数据时立即加锁,以防止其他事务访问同一数据,从而避免潜在的数据不一致问题。文章还详细分析了这两种锁机制在实际应用中的优缺点,并介绍了Hibernate中的多态特性如何与锁机制结合,以实现更高效的数据管理和并发控制。 ... [详细]
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社区 版权所有