数据准备

  1. 在mysql中创建测试表orders

    CREATE TABLE `orders` (`orderid` int(11) NOT NULL AUTO_INCREMENT,`status` varchar(255) NOT NULL,`createtime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`modifiedtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`orderid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    

    插入测试数据

    INSERT INTO `orders` VALUES ('1', '创建', '2019-03-21 10:19:53', '2019-03-21 10:20:33');
    INSERT INTO `orders` VALUES ('2', '创建', '2019-03-21 10:20:42', '2019-03-21 10:20:42');
    INSERT INTO `orders` VALUES ('3', '创建', '2019-03-21 10:20:55', '2019-03-21 10:20:55');
    INSERT INTO `orders` VALUES ('4', '创建', '2019-03-21 10:21:00', '2019-03-21 10:21:00');
    INSERT INTO `orders` VALUES ('5', '创建', '2019-03-21 10:21:05', '2019-03-21 10:21:05');
    

  2. 创建hive表
    1. 在数据仓库的ODS层,创建增量表,按天分区,存放每天的增量数据

      beeline -u jdbc:hive2://192.168.1.101:10000 -n hive -e  "CREATE TABLE ods_orders_inc (orderid INT,createtime STRING,modifiedtime STRING,status STRING) PARTITIONED BY (day STRING) row format delimited fields terminated by '\t' stored AS textfile;
      "
      
    2. 在数据仓库的DW层,创建历史数据拉链表,存放历史状态数据
      beeline -u jdbc:hive2://192.168.1.101:10000 -n hive -e  "CREATE TABLE dw_orders_his (orderid INT,createtime STRING,modifiedtime STRING,status STRING,dw_start_date STRING,dw_end_date STRING) row format delimited fields terminated by '\t' stored AS textfile;
      "
      

全量初始化

  1. 利用sqoop抽取全量数据到ODS增量表中

    sqoop import \
    --connect "jdbc:mysql://192.168.1.101:3306/testdb" \
    --username "root" \
    --password "123456" \
    --table "orders" \
    --split-by "orderid" \
    --columns "orderid,createtime,modifiedtime,status" \
    --where "modifiedtime < '2019-03-21'" \
    --fields-terminated-by '\t' \
    --hive-import \
    --hive-database default \
    --hive-table "ods_orders_inc" \
    --hive-partition-key "day" \
    --hive-partition-value '2019-03-20' \
    --null-string '\\N' \
    --null-non-string '\\N' \
    --hive-drop-import-delims \
    --m 1
    
  2. 查看ods_orders_inc表数据
  3. 将ODS数据刷新到DW中
    beeline -u jdbc:hive2://192.168.1.101:10000 -n hive -e  "INSERT overwrite TABLE dw_orders_hisSELECT orderid,status,createtime,modifiedtime,to_date(createtime) AS dw_start_date,'9999-12-31' AS dw_end_dateFROM ods_orders_incWHERE DAY = '2019-03-20';
    "
    

增量抽取

  1. 每天从业务表中,将前一天的增量数据抽取到ODS层的增量表中

    sqoop import \
    --connect "jdbc:mysql://192.168.1.101:3306/hft" \
    --username "root" \
    --password "123456" \
    --table "orders" \
    --split-by "orderid" \
    --columns "orderid,createtime,modifiedtime,status" \
    --where "(createtime  >= '2019-03-21' and createtime < '2019-03-22') OR (modifiedtime >= '2019-03-21' and modifiedtime < '2019-03-22')"  \
    --fields-terminated-by '\t' \
    --hive-import \
    --hive-database default \
    --hive-table "ods_orders_inc" \
    --hive-partition-key "day" \
    --hive-partition-value '2019-03-21' \
    --null-string '\\N' \
    --null-non-string '\\N' \
    --hive-drop-import-delims \
    --m 1
    

    注意

    1. 增量需要通过业务表中的创建时间和修改时间来确定
    2. 在ODS层按天分区的增量表,最好保留一段时间的数据。比如半年,为了防止某一天的数据有问题而回滚重做数据。
  2. 增量刷新历史数据
    先把数据放到一张临时表中

    beeline -u jdbc:hive2://192.168.1.101:10000 -n hive -e  "
    DROP TABLE IF EXISTS dw_orders_his_tmp;
    CREATE TABLE dw_orders_his_tmp AS
    SELECT orderid,createtime,modifiedtime,status,dw_start_date,dw_end_date
    FROM(SELECT a.orderid,a.createtime,a.modifiedtime,a.status,a.dw_start_date,CASEWHEN b.orderid IS NOT NULLAND a.dw_end_date > '2019-03-21' THEN '2019-03-20'ELSE a.dw_end_dateEND AS dw_end_dateFROM dw_orders_his aLEFT OUTER JOIN(SELECT *FROM ods_orders_incWHERE DAY = '2019-03-21') b ON (a.orderid = b.orderid)UNION ALL SELECT orderid,createtime,modifiedtime,status,to_date(modifiedtime) AS dw_start_date,'9999-12-31' AS dw_end_dateFROM ods_orders_incWHERE DAY = '2019-03-21' ) x
    ORDER BY orderid,dw_start_date;
    "
    

    要点

    UNION ALL的两个结果集中,
    第一个是用历史拉链表left outer join 日期为2019-03-21的增量,能关联上并且dw_end_date > ‘2019-03-21’,说明状态有变化,则把原来的dw_end_date置为2019-03-20,
    关联不上的,说明状态无变化,dw_end_date则不变。
    第二个结果集是直接将日期为2019-03-21的增量数据插入历史拉链表。

  3. 把临时表中数据插入DW层历史拉链表中

    beeline -u jdbc:hive2://192.168.1.101:10000 -n hive -e  "INSERT overwrite TABLE t_dw_orders_hisSELECT *FROM t_dw_orders_his_tmp;
    "
    

Hive数据仓库中历史拉链表实践相关推荐

  1. 数据仓库中历史拉链表的更新方法

    原文地址:http://lxw1234.com/archives/2015/08/473.htm 这里简单介绍一下这种历史拉链表的更新方法. 本文中假设: 数据仓库中订单历史表的刷新频率为一天,当天更 ...

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

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

  3. hive 分区_Hive下数据仓库历史拉链表如何加工,分区键该如何选择

    缓慢变化维 说到历史拉链表,首先得说下缓慢变化维. 在现实世界中,维度的属性并不是静态的,而是随着时间的变化而变化,这也体现了数据仓库的特点之一,是反映历史变化的.相对于数据增长较为快速的事实表,维度 ...

  4. 数据仓库数据模型之:极限存储--历史拉链表

    摘要: 在数据仓库的数据模型设计过程中,经常会遇到文内所提到的这样的需求.而历史拉链表,既能满足对历史数据的需求,又能很大程度的节省存储资源. 在数据仓库的数据模型设计过程中,经常会遇到这样的需求: ...

  5. greenplum 历史拉链表

    3.1 历史拉链表 数据仓库定义:是一个面向主题的.集成的.相对稳定的.反映历史变化的数据集合,用于支持管理决策. 历史拉链表:一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的.它记录了 ...

  6. 数据仓库历史数据存储-拉链表

    拉链表 拉链表是维护历史状态.以及最新状态的一种方式. 拉链表对快照表进行了优化,根据拉链粒度(一般为时间)的不同,去除了在粒度范围内不变的数据. 拉链表可以维护两个时间(start_time, en ...

  7. Hive数仓之拉链表(原理、设计以及在Hive中的实现)

    正  文 0x00 前言 本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成: 先分享一下拉链表的用途.什么是拉链表. 通过一些 ...

  8. 数据仓库历史数据存储 - 拉链表

    假如我们有一个账号account表,我们需要在hive中存储(数据是从线上mysql读取binlog同步来的,是有明细变化的) account表结构:account_id, username, fol ...

  9. hql取满足条件最新一条记录_数据仓库怎么做拉链表记录数据变化情况,看看这篇文章 就明白了...

    小文老师给你讲解数据仓库的ETL拉链算法,通过这篇文档,让你快速了解数据拉链. 一 首先我们先来看下,什么是拉链?在数据仓库中,拉链就是记录数据在某一时间区间内的状态以及数据在某一时间点上的数据变化的 ...

最新文章

  1. 电路基础知识 -- 三态
  2. selenium(2.4.0)中不能导出web drive 代码
  3. react-redux中的持久化数据存储redux-persist
  4. java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...
  5. matlab第十章实验,matlab 图像函数以及运用(第十章)
  6. 图像处理系统概述(白皮书)
  7. macOS Monterey更新后遇到的bug问题汇总与解决
  8. 家庭医疗系统-基于蓝牙无线通信技术
  9. 谷歌翻译插件安装使用
  10. Lena图像原图及由来
  11. 中国科学院计算机所刘夏真,中国科学院大学2015年博士生录取名单公示(55)
  12. 【历史上的今天】9 月 4 日:谷歌(Google) 23 周年;“人工智能之父” McCarthy 诞生
  13. python实现归结演绎推理_人工智能——归结演绎推理
  14. 无线路由器和有线路由器桥接
  15. iPad播放网页视频(h5 video)失败的处理方法(Django网站)
  16. deepin 作为日常办公系统
  17. 提高工作效率的15个技巧
  18. FMDB数据库的升级
  19. 求职信英语计算机作文,英语作文-求职信(范文)
  20. Arcgis Server 发布服务报错Failed to start the server machine ‘XXX‘. Error while starting AppServer. Requir

热门文章

  1. 小程序的横向二级顶部导航条,可以切换、拖动、二级定位在一级的下面,高度怎么办
  2. WIN 10关闭更新
  3. QT读写文本文件编码设置
  4. android 虚拟键 高度,Android获取虚拟按键的高度(适配全面屏)
  5. BUAA-2021春-数据结构-综合作业-文本摘要生成(Hash实现 + SIMD优化 终测最速)
  6. cocos2d-x3.2中用shader使图片背景透明
  7. 计算机控制实验报告组态软件学习,中北大学组态软件实验报告
  8. “消费盲返”的商业模式,你知道多少?
  9. Ecstore的微信账号绑定会员免登录
  10. STM32实现基于I2C的AHT20温湿度采集