指点成金-最美分享吧

登录

数仓-拉链表的详细实现过程

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了数仓-拉链表的详细实现过程相关的知识,希望对你有一定的参考价值。

目录

目录

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

2、建立拉链表

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 parquetlocation "/warehouse/gmall/dwd/dwd_order_info_his/"tblproperties ("parquet.compression"="snappy");

3、初始化拉链表

insert overwrite table dwd_order_info_hisselect    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 oiwhere oi.dt="2019-02-13";

4、查询拉链表中的数据

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 parquetlocation "/warehouse/gmall/dwd/dwd_order_info_his_tmp/"tblproperties ("parquet.compression"="snappy");

导入脚本:

insert overwrite table dwd_order_info_his_tmpselect * 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_datefrom 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_datefrom dwd_order_info_his oh left join      (select*from dwd_order_infowhere 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-总结

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

以上是关于数仓-拉链表的详细实现过程的主要内容,如果未能解决你的问题,请参考以下文章

上一篇array_pop()方法

下一篇主定理