赞
踩
某些表(如用户表)中的数据每日既有可能新增,也有可能修改,但修改频率并不高,属于缓慢变化维度,此处采用拉链表存储(用户维度)数据。
(1)建立拉链表
drop table if exists dwd_dim_user_info_his; create external table dwd_dim_user_info_his( `id` string COMMENT '用户id', `name` string COMMENT '姓名', `birthday` string COMMENT '生日', `gender` string COMMENT '性别', `email` string COMMENT '邮箱', `user_level` 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_dim_user_info_his/' tblproperties ("parquet.compression"="lzo");
(2)初始化拉链表
insert overwrite table dwd_dim_user_info_his
select
id,
name,
birthday,
gender,
email,
user_level,
create_time,
operate_time,
'2020-03-10',
'9999-99-99'
from ods_user_info oi
where oi.dt='2020-03-10';
步骤1:制作当日变动数据(包括新增,修改)每日执行
a.最好表内有创建时间和变动时间(Lucky!)
b.如果没有,可以利用第三方工具监控比如canal,监控MySQL的实时变化进行记录(麻烦)
c.逐行对比前后两天的数据,检查md5(concat(全部有可能变化的字段))是否相同(low)
d.要求业务数据库提供变动流水
数据库中新增2020-03-11这一天的数据
步骤2:先合并变动信息,再追加新增信息,插入到临时表中
drop table if exists dwd_dim_user_info_his_tmp; create external table dwd_dim_user_info_his_tmp( `id` string COMMENT '用户id', `name` string COMMENT '姓名', `birthday` string COMMENT '生日', `gender` string COMMENT '性别', `email` string COMMENT '邮箱', `user_level` 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_dim_user_info_his_tmp/' tblproperties ("parquet.compression"="lzo");
insert overwrite table dwd_dim_user_info_his_tmp select * from ( --5 查询3.11号新增变动明细表数据,并打上 '2020-03-11' start_date 和 '9999-99-99' end_date开始结束日期 select id, name, birthday, gender, email, user_level, create_time, operate_time, '2020-03-11' start_date, '9999-99-99' end_date from ods_user_info where dt='2020-03-11' -- 6 使用 union all合并用户全量数据和变化之后的数据 union all --4 更新用户表内发生变化的数据 select uh.id, uh.name, uh.birthday, uh.gender, uh.email, uh.user_level, uh.create_time, uh.operate_time, uh.start_date, --3 如果关联上则表示该用户数据发生变化,则将end_date设为新增变动明细表日期减一天(T+1任务) --否则依旧为用户表结束日期('9999-99-99'),其它可能发生变化的字段也类似如此处理 if(ui.id is not null and uh.end_date='9999-99-99', date_add(ui.dt,-1), uh.end_date) end_date from dwd_dim_user_info_his uh --2 用户表全量信息 Left join 变化表数据 left join ( --1 查询3.11号新增变动明细表全量数据 select * from ods_user_info where dt='2020-03-11' ) ui on uh.id=ui.id )his order by his.id, start_date;
步骤3:把临时表覆盖给拉链表
insert overwrite table dwd_dim_user_info_his
select * from dwd_dim_user_info_his_tmp;
select id, start_date, end_date from dwd_dim_user_info_his;
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=8s7qax3sngdw
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。