分享

大数据项目之电商数仓(总结)(八):系统业务数据仓库-拉链表


问题导读

1.什么是拉链表?
2.拉链表如何更新?
3.拉链表制作包含哪些过程?


上一篇
大数据项目之电商数仓(总结)(八):系统业务数据仓库
https://www.aboutyun.com/forum.php?mod=viewthread&tid=30286


第15章 订单表拉链表

15.1 什么是拉链表

1.png
15.2 为什么要做拉链表

1.png
1.png

15.3 拉链表形成过程

1.png

15.4 拉链表制作过程图

1.png

15.5 拉链表制作过程
15.5.1 步骤0:初始化拉链表(首次独立执行)


1.png

1)生成10条原始订单数据
  1. CALL init_data('2019-02-13',10,5,10,TRUE);
  2. [kgg@hadoop102 bin]$ sqoop_import.sh all 2019-02-13
  3. [kgg@hadoop102 bin]$ ods_db.sh 2019-02-13
  4. [kgg@hadoop102 bin]$ dwd_db.sh 2019-02-13
复制代码


2)建立拉链表
  1. hive (gmall)>
  2. drop table if exists dwd_order_info_his;
  3. create external table dwd_order_info_his(
  4.     `id` string COMMENT '订单编号',
  5.     `total_amount` decimal(10,2) COMMENT '订单金额',
  6.     `order_status` string COMMENT '订单状态',
  7.     `user_id` string COMMENT '用户id' ,
  8.     `payment_way` string COMMENT '支付方式',
  9.     `out_trade_no` string COMMENT '支付流水号',
  10.     `create_time` string COMMENT '创建时间',
  11.     `operate_time` string COMMENT '操作时间',
  12.     `start_date`  string COMMENT '有效开始日期',
  13.     `end_date`  string COMMENT '有效结束日期'
  14. ) COMMENT '订单拉链表'
  15. stored as parquet
  16. location '/warehouse/gmall/dwd/dwd_order_info_his/'
  17. tblproperties ("parquet.compression"="snappy");
复制代码


3)初始化拉链表
  1. hive (gmall)>
  2. insert overwrite table dwd_order_info_his
  3. select
  4.     id,
  5.     total_amount,
  6.     order_status,
  7.     user_id,
  8.     payment_way,
  9.     out_trade_no,
  10.     create_time,
  11.     operate_time,
  12.     '2019-12-16',
  13.     '9999-99-99'
  14. from ods_order_info oi
  15. where oi.dt='2019-12-16';
复制代码


4)查询拉链表中数据
  1. hive (gmall)> select * from dwd_order_info_his limit 2;
复制代码



15.5.2 步骤1:制作当日变动数据(包括新增,修改)每日执行
1)如何获得每日变动表
(1)最好表内有创建时间和变动时间(Lucky!)
(2)如果没有,可以利用第三方工具监控比如canal,监控MySQL的实时变化进行记录(麻烦)。
(3)逐行对比前后两天的数据, 检查md5(concat(全部有可能变化的字段))是否相同(low)
(4)要求业务数据库提供变动流水(人品,颜值)

2)因为dwd_order_info本身导入过来就是新增变动明细的表,所以不用处理
(1)2019-02-14日新增2条订单数据
  1. CALL init_data('2019-02-14',2,5,10,TRUE);
复制代码


(2)通过Sqoop把2019-02-14日所有数据导入
  1. sqoop_import.sh all 2019-02-14
复制代码


(3)ODS层数据导入
  1. sqoop_import.sh all 2019-02-14
复制代码


(4)DWD层数据导入
  1. dwd_db.sh 2019-02-14
复制代码



15.5.3 步骤2:先合并变动信息,再追加新增信息,插入到临时表中
1)建立临时表
  1. hive (gmall)>
  2. drop table if exists dwd_order_info_his_tmp;
  3. create table dwd_order_info_his_tmp(
  4.     `id` string COMMENT '订单编号',
  5.     `total_amount` decimal(10,2) COMMENT '订单金额',
  6.     `order_status` string COMMENT '订单状态',
  7.     `user_id` string COMMENT '用户id' ,
  8.     `payment_way` string COMMENT '支付方式',  
  9.     `out_trade_no` string COMMENT '支付流水号',  
  10.     `create_time` string COMMENT '创建时间',  
  11.     `operate_time` string COMMENT '操作时间',
  12.     `start_date`  string COMMENT '有效开始日期',
  13.     `end_date`  string COMMENT '有效结束日期'
  14. ) COMMENT '订单拉链临时表'
  15. stored as parquet
  16. location '/warehouse/gmall/dwd/dwd_order_info_his_tmp/'
  17. tblproperties ("parquet.compression"="snappy");
复制代码
2)导入脚本

1.png

  1. hive (gmall)>
  2. insert overwrite table dwd_order_info_his_tmp
  3. select * from
  4. (
  5. select
  6. id,
  7.     total_amount,
  8.     order_status,
  9.     user_id,
  10.     payment_way,
  11.     out_trade_no,
  12.     create_time,
  13.     operate_time,
  14.     '2019-02-14' start_date,
  15.     '9999-99-99' end_date
  16. from dwd_order_info where dt='2019-02-14'
  17. union all
  18. select oh.id,
  19.     oh.total_amount,
  20.     oh.order_status,
  21.     oh.user_id,
  22.     oh.payment_way,
  23.     oh.out_trade_no,
  24.     oh.create_time,
  25.     oh.operate_time,
  26.     oh.start_date,
  27.     if(oi.id is null, oh.end_date, date_add(oi.dt,-1)) end_date
  28. from dwd_order_info_his oh left join
  29.      (
  30. select
  31. *
  32. from dwd_order_info
  33. where dt='2019-02-14'
  34. ) oi
  35.      on oh.id=oi.id and oh.end_date='9999-99-99'  
  36. )his
  37. order by his.id, start_date;
复制代码

15.5.4 步骤3:把临时表覆盖给拉链表
1)导入数据
  1. hive (gmall)>
  2. insert overwrite table dwd_order_info_his
  3. select * from dwd_order_info_his_tmp;
复制代码


2)查询导入数据
  1. hive (gmall)> select * from dwd_order_info_his;
复制代码




最新经典文章,欢迎关注公众号



已有(2)人评论

跳转到指定楼层
YTP520YTP 发表于 2021-2-8 10:56:09
学习拉链表
回复

使用道具 举报

康vip 发表于 2021-2-18 12:15:19
支持你,辛苦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条