当前位置:   article > 正文

数据仓库中如何创建拉链表?_pg拉链表设计

pg拉链表设计

  某些表(如用户表)中的数据每日既有可能新增,也有可能修改,但修改频率并不高,属于缓慢变化维度,此处采用拉链表存储(用户维度)数据。

1 什么是拉链表

在这里插入图片描述

2 如何做拉链表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 拉链表制作过程

步骤0:初始化拉链表(首次独立执行)

(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");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

步骤1:制作当日变动数据(包括新增,修改)每日执行

(1)如何获得每日变动表

  a.最好表内有创建时间和变动时间(Lucky!)

  b.如果没有,可以利用第三方工具监控比如canal,监控MySQL的实时变化进行记录(麻烦)

  c.逐行对比前后两天的数据,检查md5(concat(全部有可能变化的字段))是否相同(low)

  d.要求业务数据库提供变动流水

(2)假设已经存在新增变动明细表(ods_order_info)

  数据库中新增2020-03-11这一天的数据

步骤2:先合并变动信息,再追加新增信息,插入到临时表中

1)建立临时表
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");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
2)将结果存入临时表
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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

步骤3:把临时表覆盖给拉链表

1)导入数据

insert overwrite table dwd_dim_user_info_his
select * from dwd_dim_user_info_his_tmp;

2)查询导入数据

select id, start_date, end_date from dwd_dim_user_info_his;

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=8s7qax3sngdw

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/826373
推荐阅读
相关标签
  

闽ICP备14008679号