一、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 函数——编写代码
- 创建函数
(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 业务数据分析
其他表不分析,直接脚本使用就可以
时间维度表(特殊)
- 建表语句
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");
-
把 date_info.txt 文件上传到 hadoop102 的/opt/module/db_log/路径
-
数据装载
注意:由于 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:很多代码仓库;
1449697757@qq.com