赞
踩
本文以订单拉链表为例进行详细讲解。
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
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");
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';
select * from dwd_order_info_his limit 2;
如何获取每日变动数据?
1. 最好表内有创建时间和变动时间(Lucky!)
2. 如果没有,可以利用第三方工具监控比如canal,监控MySQL的实时变化进行记录(麻烦)。
3. 逐行对比前后两天的数据, 检查md5(concat(全部有可能变化的字段))是否相同(low)
4. 要求业务数据库提供变动流水(人品,颜值)
因为dwd_order_info本身导入过来就是新增变动明细的表,所以不用处理
sqoop_import.sh all 2019-02-14
ods_db.sh 2019-02-14
dwd_db.sh 2019-02-14
首先建立临时表
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;
导入数据
insert overwrite table dwd_order_info_his
select * from dwd_order_info_his_tmp;
以上就是拉链表的详细实现过程,主要是要搞懂各个时间段的含义,多看几遍,面试必备!!!!
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。