马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
DWD层 先容
究竟表如果必要分区做分区表,必要构建拉链表则构建拉链表
如果数据没有脏数据, 则不必要举行数据清洗
常见脏数据类型
区分究竟表和维度表
示例
究竟表后续会频繁更新,必要使用拉链表记载数据的历史状态
拉链表
从表结构来说,必须要有开链时间和闭链时间 两个字段,因为它记载了每一条数据的生命周期
设计表的时间必须包含 start_date(开链时间) 和 end_date(闭链时间) ,
数据更新时,通过修改 end_date 来设置数据的有效时间
如果没有拉链表, 难以分辨数据的最新时间
DWD实操分析(带拉链表)
使用oracle模拟
从源表抽取数据到拉链表
留意: 数据还未结束生命周期, 默认设置的生命周期非常大
第一天拉链表的数据
SELECT * FROM DW_LLB;
增量表的数据
分析 拉链表想要的效果
如果DW_INT(增量表)的数据可以被拉链表连接上(不是NULL值), 分析源表数据的生命周期结束了(数据被更新了), EN_DT(闭链时间)应当等于DW_INT(增量表)的USER_DT(使用case when )
更新数据的
获取新增数据>>从增量表DW_INT
获取新增/更新数据>> union all 和排序order by START_DT >>拉链表的终极状态
如果是hive 中
如果关系型数据库>>truncate >> insert
因为sql背面后必要用到拉链表,所以不能清空拉链表>>新建一个终极表ZZB
终极表的数据
SELECT * FROM DW_ZZB;
每次新增/更新数据前都必要先清空增量表
把新增/更新的数据导入增量表
insert into dw_int select * from src where user_dt = date '2025-02-03';
从拉链表中取数据
从拉链表中查找最新数据 where END_DT=date '9999-12-31'
找所有效户在2月2号的余额 数据: START_DT 是2月2号之前的,且END_DT是大于等于2月2号
DWD构建示例
建数据库>>建表
在hive
drop database if exists dwd;
create database if not exists dwd;
直接使用CREATE TABLE AS SELECT创建表,新表没有源表的的解释, 必要手动添加
1.建表后添加(oracle)
2.手动建表并添加解释
1.根据数据字典来确定字段,数据类型,解释
留意: 建表使用的数据库是否支持相应的数据类型>>更改数据类型
解释: 大部分解释写字段中文名即可, 但是罗列类型的解释写出罗列内容, 因为偶尔候存数据只存序号
2. update_time: 根据这个字段判断数据有没有更新, 如果是NULL值,是原始数据
3. 把表变成拉链表: 添加start_dt(开链时间), end_dt(闭链时间) ,这里把start_dt变成表外字段用来对表举行分区
4.ROW FORMAT DELIMITED>>Hive 中界说表数据存储格式(行存)
fields terminated by '\t'
STORED AS ORC >>界说表的存储格式为 ORC (列存储格式)
2.导入数据
因为分区值采取上一张表的>>开启动态分区
插入数据sql要和开启动态分区,设置非严酷模式这2条sql一起执行才能插入
- -- 开启动态分区
- set hive.exec.dynamic.partition=true;
- -- 设置非严格模式
- set hive.exec.dynamic.partition.mode=nonstrict;
- insert into dwd.fact_shop_order partition (start_dt)
- select
- id,
- order_num,
- buyer_id,
- store_id,
- case when order_from = 1 then 'android'
- when order_from = 2 then 'ios'
- when order_from = 3 then 'miniapp'
- when order_from = 4 then 'PC'
- end as order_from,
- order_state,
- create_date,
- finnshed_time,
- is_settlement,
- is_delete,
- evaluation_state,
- way,
- is_stock_up,
- create_user,
- create_time,
- update_user,
- update_time,
- is_valid,
- '9999-99-99' as end_dt,
- dt as start_dt
- from ods_sjh.t_shop_order;
复制代码 1.数据预处理: 在上一层ODS(贴源层)的t_shop_order表的订单状态(order_from)罗列类型 存储的是1,2,3 ,没有直接存储内容,在DWD层给数据举行转换,背面在使用数据的时间比力方便
2.DWD.FACT_SHOP_ORDER表(目标表)比(源表)ods_sjh.t_shop_order多2个字段>>end_dt和分区字段start_dt,
数据导入方式
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |