拉链表的详细实现过程(好文点赞收藏!!)

目录

  • 1-什么是拉链表
  • 2-为什么要做拉链表
    • 2.1-如何使用拉链表
  • 3-拉链表的形成过程
  • 4-拉链表的制作过程
    • 4.1-初始化拉链表(首次独立执行)
    • 4.2-制作当日变动数据(包括新增,修改)每日执行
    • 4.3-先合并变动信息,再追加新增信息,插入到临时表中
    • 4.4-把临时表覆盖给拉链表
  • 5-总结

1-什么是拉链表

本文以订单拉链表为例进行详细讲解。

在这里插入图片描述

2-为什么要做拉链表

2.1-如何使用拉链表

3-拉链表的形成过程

4-拉链表的制作过程

在这里插入图片描述

4.1-初始化拉链表(首次独立执行)

在这里插入图片描述

  1. 先生成10条原始订单数据(测试数据)
CALL init_data('2019-02-13',10,5,10,TRUE);

[KG@hadoop102 bin]$ sqoop_import.sh all 2019-02-13

[KG@hadoop102 bin]$ ods_db.sh 2019-02-13

[KG@hadoop102 bin]$ dwd_db.sh 2019-02-13
  1. 建立拉链表
drop table if exists dwd_order_info_his;
create external table dwd_order_info_his(
    `id` string COMMENT '订单编号',
    `total_amount` decimal(10,2) COMMENT '订单金额',
    `order_status` string COMMENT '订单状态',
    `user_id` string COMMENT '用户id' ,
    `payment_way` string COMMENT '支付方式',
    `out_trade_no` string COMMENT '支付流水号',
    `create_time` string COMMENT '创建时间',
    `operate_time` string COMMENT '操作时间',
    `start_date`  string COMMENT '有效开始日期',
    `end_date`  string COMMENT '有效结束日期'
) COMMENT '订单拉链表'
stored as parquet
location '/warehouse/gmall/dwd/dwd_order_info_his/'
tblproperties ("parquet.compression"="snappy");
  1. 初始化拉链表
insert overwrite table dwd_order_info_his
select
    id,
    total_amount,
    order_status,
    user_id,
    payment_way,
    out_trade_no,
    create_time,
    operate_time,
    '2019-02-13',
    '9999-99-99'
from ods_order_info oi
where oi.dt='2019-02-13';
  1. 查询拉链表中的数据
select * from dwd_order_info_his limit 2;

4.2-制作当日变动数据(包括新增,修改)每日执行

如何获取每日变动数据?

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

因为dwd_order_info本身导入过来就是新增变动明细的表,所以不用处理

  1. 2019-02-14日新增2条订单数据
  2. 通过Sqoop把2019-02-14日所有数据导入sqoop_import.sh all 2019-02-14
  3. ODS层数据导入ods_db.sh 2019-02-14
  4. DWD层数据导入dwd_db.sh 2019-02-14

4.3-先合并变动信息,再追加新增信息,插入到临时表中

首先建立临时表

drop table if exists dwd_order_info_his_tmp;
create table dwd_order_info_his_tmp( 
    `id` string COMMENT '订单编号',
    `total_amount` decimal(10,2) COMMENT '订单金额', 
    `order_status` string COMMENT '订单状态', 
    `user_id` string COMMENT '用户id' ,
    `payment_way` string COMMENT '支付方式',  
    `out_trade_no` string COMMENT '支付流水号',  
    `create_time` string COMMENT '创建时间',  
    `operate_time` string COMMENT '操作时间',
    `start_date`  string COMMENT '有效开始日期',
    `end_date`  string COMMENT '有效结束日期'
) COMMENT '订单拉链临时表'
stored as parquet
location '/warehouse/gmall/dwd/dwd_order_info_his_tmp/'
tblproperties ("parquet.compression"="snappy");

导入脚本:

insert overwrite table dwd_order_info_his_tmp
select * from 
(
select 
id,
    total_amount,
    order_status,
    user_id,
    payment_way,
    out_trade_no,
    create_time,
    operate_time,
    '2019-02-14' start_date,
    '9999-99-99' end_date
from dwd_order_info where dt='2019-02-14'

union all 
select oh.id,
    oh.total_amount,
    oh.order_status,
    oh.user_id,
    oh.payment_way,
    oh.out_trade_no,
    oh.create_time,
    oh.operate_time,
    oh.start_date,
    if(oi.id is null, oh.end_date, date_add(oi.dt,-1)) end_date
from dwd_order_info_his oh left join 
     (
select
*
from dwd_order_info
where dt='2019-02-14'
) oi
     on oh.id=oi.id and oh.end_date='9999-99-99'  
)his 
order by his.id, start_date;

4.4-把临时表覆盖给拉链表

导入数据

insert overwrite table dwd_order_info_his 
select * from dwd_order_info_his_tmp;

5-总结

以上就是拉链表的详细实现过程,主要是要搞懂各个时间段的含义,多看几遍,面试必备!!!!

你可能感兴趣的:(hive和数据仓库(离线),hive,sql,数据仓库,etl,面试)