大数据-数仓分层之DWD

一、DWD层描述

脚本:
在这里插入图片描述

1)对用户行为数据解析。
2)对核心数据进行判空过滤。
3)对业务数据采用维度模型重新建模。

1.1 日志分析

1.1.1 用户行为日志解析

(1)页面埋点日志
在这里插入图片描述
(2)启动日志
在这里插入图片描述

1.1.2 get_json_object 函数使用

1)数据

[{
    
    "name":" 大 郎 ","sex":" 男 ","age":"25"},{
    
    "name":" 西 门 庆 ","sex":"  男
","age":"47"}]

2)取出第一个 json 对象:

hive (gmall)>
select get_json_object('[{"name":"大郎","sex":"男","age":"25"},{"name":"西
门庆","sex":"男","age":"47"}]','$[0]');

结果是:{“name”:“大郎”,“sex”:“男”,“age”:“25”}

3)取出第一个 json 的 age 字段的值

select 
get_json_object('[{"name":" "大郎","sex":"男","age":"25"},{"name":"西门庆","sex":"男","age":"47"}]',"$[0].age");

结果是:25

1.1.3 启动日志表

  启动日志解析思路:启动日志表中每行数据对应一个启动记录,一个启动记录应该包含日志中的公共信息和启动信息。先将所有包含 start 字段的日志过滤出来, 然后使用
get_json_object 函数解析每个字段

1.1.4 页面日志表

  页面日志解析思路:页面日志表中每行数据对应一个页面访问记录,一个页面访问记录应该包含日志中的公共信息和页面信息。先将所有包含 page 字段的日志过滤出来,然后使用 get_json_object 函数解析每个字段。

1.1.5 动作日志表

  动作日志解析思路:动作日志表中每行数据对应用户的一个动作记录,一个动作记录应当包含公共信息、页面信息以及动作信息。先将包含 action 字段的日志过滤出来,然后通过
UDTF 函数,将 action 数组“炸开”(类似于 explode 函数的效果),然后使用 get_json_object
函数解析每个字段。

创建 UDTF 函数——设计思路
在这里插入图片描述

1.1.6 创建 UDTF 函数——编写代码

gitee源码

  1. 创建函数
    (1)打包
    (2)将 hivefunction-1.0-SNAPSHOT.jar 上传到 hadoop102 的/opt/module,然后再将该
    jar 包上传到 HDFS 的/user/hive/jars 路径下
    (3)创建永久函数与开发好的 java class 关联
create function explode_json_array as 'com.atguigu.hive.udtf.ExplodeJSONArray' using jar
'hdfs://hadoop102:8020/user/hive/jars/hivefunction-1.0-SNAPSHO T.jar';

(4)注意:如果修改了自定义函数重新生成 jar 包怎么处理?只需要替换 HDFS 路径上的旧 jar 包,然后重启 Hive 客户端即可。

1.1.7 曝光日志表

  曝光日志解析思路:曝光日志表中每行数据对应一个曝光记录,一个曝光记录应当包含公共信息、页面信息以及曝光信息。先将包含 display 字段的日志过滤出来,然后通过 UDTF函数,将 display 数组“炸开”(类似于 explode 函数的效果),然后使用 get_json_object函数解析每个字段。

1.1.8 错误日志表

  错误日志解析思路:错误日志表中每行数据对应一个错误记录,为方便定位错误,一个错误记录应当包含与之对应的公共信息、页面信息、曝光信息、动作信息、启动信息以及错误信息。先将包含 err 字段的日志过滤出来,然后使用 get_json_object 函数解析所有字段。

1.1.9 脚本启动

[root@hadoop102 module]$  ods_to_dwd_log.sh 2020-06-15

1.2 业务数据分析

其他表不分析,直接脚本使用就可以

时间维度表(特殊)

  1. 建表语句
hive (gmall)>
DROP TABLE IF EXISTS `dwd_dim_date_info`; CREATE EXTERNAL TABLE `dwd_dim_date_info`(
`date_id` string COMMENT '日',
`week_id` string COMMENT '周',
`week_day` string COMMENT '周的第几天',
`day` string COMMENT '每月的第几天',
`month` string COMMENT '第几月',
`quarter` string COMMENT '第几季度',
`year` string COMMENT '年',
`is_workday` string COMMENT '是否是周末',
`holiday_id` string COMMENT '是否是节假日'
) COMMENT '时间维度表' stored as parquet
location '/warehouse/gmall/dwd/dwd_dim_date_info/'
tblproperties ("parquet.compression"="lzo");
  1. 把 date_info.txt 文件上传到 hadoop102 的/opt/module/db_log/路径

  2. 数据装载
    在这里插入图片描述

注意:由于 dwd_dim_date_info 是列式存储+LZO 压缩。直接将 date_info.txt 文件导入到目标表, 并不会直接转换为列式存储+LZO 压缩。我们需要创建一张普通的临时表
dwd_dim_date_info_tmp,将 date_info.txt 加载到该临时表中。最后通过查询临时表数据,把查询到的数据插入到最终的目标表中。
(1)创建临时表,非列式存储

hive (gmall)>
DROP TABLE IF EXISTS `dwd_dim_date_info_tmp`; CREATE EXTERNAL TABLE `dwd_dim_date_info_tmp`(
`date_id` string COMMENT '日',
`week_id` string COMMENT '周',
`week_day` string COMMENT '周的第几天',
`day` string COMMENT '每月的第几天',
`month` string COMMENT '第几月',
`quarter` string COMMENT '第几季度',
`year` string COMMENT '年',
`is_workday` string COMMENT '是否是周末',
`holiday_id` string COMMENT '是否是节假日'
) COMMENT '时间临时表'
row format delimited fields terminated by '\t'  location '/warehouse/gmall/dwd/dwd_dim_date_info_tmp/';

(2)将数据导入临时表

hive (gmall)>
load data local	inpath '/opt/module/db_log/date_info.txt'	into	table dwd_dim_date_info_tmp;

(3)将数据导入正式表

hive (gmall)>
insert overwrite table dwd_dim_date_info select * from dwd_dim_date_info_tmp;

用户维度表(拉链表)

用户表中的数据每日既有可能新增,也有可能修改,但修改频率并不高,属于缓慢变化维度,此处采用拉链表存储用户维度数据。
**注:**这里直接使用脚本就可以了

脚本使用

初始化:

[root@hadoop102 bin]$ ods_to_dwd_db.sh first 2020-06-18

之后每次:

[root@hadoop102 bin]$ ods_to_dwd_db.sh all 2020-06-19

总结


感谢大家阅、互相学习;
感谢尚硅谷提供的学习资料;
有问题评论或者发邮箱;
gitee:很多代码仓库;
[email protected]

猜你喜欢

转载自blog.csdn.net/weixin_44704261/article/details/111939786