搭建数仓(hive):DWD层(数据明细层)实操

打印 上一主题 下一主题

主题 940|帖子 940|积分 2820

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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一起执行才能插入
  1. -- 开启动态分区
  2. set hive.exec.dynamic.partition=true;
  3. -- 设置非严格模式
  4. set hive.exec.dynamic.partition.mode=nonstrict;
  5. insert into dwd.fact_shop_order partition (start_dt)
  6. select
  7.     id,
  8.     order_num,
  9.     buyer_id,
  10.     store_id,
  11.     case when order_from = 1 then 'android'
  12.         when order_from = 2 then 'ios'
  13.         when order_from = 3 then 'miniapp'
  14.         when order_from = 4 then 'PC'
  15.     end as order_from,
  16.     order_state,
  17.     create_date,
  18.     finnshed_time,
  19.     is_settlement,
  20.     is_delete,
  21.     evaluation_state,
  22.     way,
  23.     is_stock_up,
  24.     create_user,
  25.     create_time,
  26.     update_user,
  27.     update_time,
  28.     is_valid,
  29.     '9999-99-99' as end_dt,
  30.     dt as start_dt
  31. 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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表