用户维度表(拉链表)

步骤0:初始化拉链表(首次独立执行)
(1)建立拉链表
hive (gmall)>
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)初始化拉链表
hive (gmall)>
SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
insert overwrite table dwd_dim_user_info_his
select
id,
name,
birthday,
gender,
email,
user_level,
create_time,
operate_time,
‘2020-06-14’,
‘9999-99-99’
from ods_user_info oi
where oi.dt=‘2020-06-14’;

步骤1:制作当日变动数据(包括新增,修改)每日执行
(1)如何获得每日变动表
a.最好表内有创建时间和变动时间(Lucky!)
b.如果没有,可以利用第三方工具监控比如canal,监控MySQL的实时变化进行记录(麻烦)。
c.逐行对比前后两天的数据,检查md5(concat(全部有可能变化的字段))是否相同(low)
d.要求业务数据库提供变动流水(人品,颜值)
(2)因为ods_user_info本身导入过来就是新增变动明细的表,所以不用处理
a)数据库中新增2020-06-15一天的数据
b)通过Sqoop把2020-06-15日所有数据导入
mysql_to_hdfs.sh all 2020-06-15
c)ods层数据导入
hdfs_to_ods_db.sh all 2020-06-15

步骤2:先合并变动信息,再追加新增信息,插入到临时表中
1)建立临时表
hive (gmall)>
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”);
2)导入脚本
hive (gmall)>
SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
insert overwrite table dwd_dim_user_info_his_tmp
select * from
(
select
id,
name,
birthday,
gender,
email,
user_level,
create_time,
operate_time,
‘2020-06-15’ start_date,
‘9999-99-99’ end_date
from ods_user_info where dt=‘2020-06-15’

union all 
select 
    uh.id,
    uh.name,
    uh.birthday,
    uh.gender,
    uh.email,
    uh.user_level,
    uh.create_time,
    uh.operate_time,
    uh.start_date,
    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 left join 
(
    select
        *
    from ods_user_info
    where dt='2020-06-15'
) ui on uh.id=ui.id

)his
order by his.id, start_date;

步骤3:把临时表覆盖给拉链表
1)导入数据
hive (gmall)>
insert overwrite table dwd_dim_user_info_his
select * from dwd_dim_user_info_his_tmp;
2)查询导入数据
hive (gmall)>
select id, start_date, end_date from dwd_dim_user_info_his limit 2;

### 拉链与维度的定义与区别 #### 拉链的定义与作用 拉链(Slowly Changing Dimension, SCD)是一种用于处理维度中缓慢变化维度数据的技术。在数据仓库中,维度中的某些属性值可能会随时间发生变化,例如商品的品牌、用户的地址等。为了记录这些变化的历史信息,拉链通过增加有效时间字段(如 `start_date` 和 `end_date`)来跟踪维度属性的变化历史。这种方法使得数据仓库能够保留历史数据,从而支持对过去某一时间点的数据查询和分析。 拉链的核心在于通过有效时间区间记录维度属性的变更。例如,一个商品维度中,商品的品牌属性可能发生变化,拉链会记录品牌变更的时间范围,从而支持历史数据的追溯。这种方法在数据仓库中广泛应用于缓慢变化维度的处理,以确保数据的完整性和准确性[^3]。 #### 维度的定义与作用 维度(Dimension Table)是数据仓库中用于描述事实中数据背景信息的。维度通常包含描述性字段,用于提供事实数据的上下文信息。例如,在销售分析中,时间维度可以描述交易发生的具体日期、月份、季度和年份;地理位置维度可以描述交易发生的地区、城市和国家等信息。维度与事实通过外键关联,为事实提供丰富的描述信息。 维度设计遵循反规范化原则,以提升查询性能和简化数据模型。维度的属性越丰富,数据仓库的能力就越强。例如,在阿里巴巴数据仓库中,商品维度设计为主维度和扩展维度,主维度包含稳定且常用的属性,而扩展维度包含变化频繁或使用较少的属性。这种设计通过存储冗余提升了模型的稳定性和查询效率[^3]。 #### 拉链与维度的区别 1. **功能定位**: - 拉链主要用于处理维度中缓慢变化的属性,通过记录属性变化的时间范围来保留历史信息。 - 维度则是数据仓库中的基础,用于提供事实数据的背景信息,通常包含描述性字段。 2. **数据结构**: - 拉链通过增加 `start_date` 和 `end_date` 字段来记录维度属性的变化历史。 - 维度通常采用扁平化设计,包含丰富的描述性字段,可能通过反规范化来提升查询性能。 3. **应用场景**: - 拉链适用于需要跟踪维度属性变化的场景,例如商品品牌变更、用户地址更新等。 - 维度适用于描述事实数据的上下文信息,例如时间、地理位置、客户信息等。 4. **更新方式**: - 拉链的更新方式较为复杂,需要记录每次属性变化的时间范围,并生成新的记录。 - 维度的更新方式相对简单,通常通过定期批量更新或实时更新来维护数据的一致性。 #### 示例代码 以下是一个拉链的示例,展示了如何记录商品品牌的变化历史: ```sql CREATE TABLE product_dimension ( product_id INT, product_name VARCHAR(255), brand VARCHAR(255), start_date DATE, end_date DATE ); -- 插入初始记录 INSERT INTO product_dimension (product_id, product_name, brand, start_date, end_date) VALUES (1, 'Product A', 'Brand X', '2023-01-01', NULL); -- 更新品牌并生成新记录 UPDATE product_dimension SET end_date = '2023-06-30' WHERE product_id = 1 AND end_date IS NULL; INSERT INTO product_dimension (product_id, product_name, brand, start_date, end_date) VALUES (1, 'Product A', 'Brand Y', '2023-07-01', NULL); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值