【离线数仓】Day02-用户行为数据仓库:分层介绍、环境搭建(hive、tez)、LZO压缩、建表查询导入加索引、编写脚本

 一、数仓分层概念

1、为什么要分层

ODS:原始数据层

DWD层:明细数据层

DWS:服务数据层

ADS:数据应用层

 2、数仓分层

 

 3、数据集市与数据仓库概念 

 4、数仓命名规范

ODS层命名为ods
DWD层命名为dwd
DWS层命名为dws
ADS层命名为ads
临时表数据库命名为xxx_tmp
备份数据数据库命名为xxx_bak

二、数仓环境搭建

1、Hive&MySQL安装

修改hive-site.xml,关闭元数据检查

设置元数据备份:每日零点之后备份到其它服务器两个

2、Hive运行引擎Tez

Hive的运行引擎,性能优于MR(用Hive直接编写MR程序,需要将中间结果持久化写到HDFS)

Tez可以将多个有依赖的作业转换为一个作业

Hive中配置Tez:/opt/module/hive/conf下面创建一个tez-site.xml文件

hive-env.sh文件中添加tez环境变量配置和依赖包环境变量配置

[atguigu@hadoop102 hive]$ bin/hive启动、创建、插入测试

三、数仓搭建之ODS层

1、创建数据库

create database gmall;

2、ODS层

支持LZO压缩配置:将编译好后的hadoop-lzo-0.4.20.jar 放入hadoop-2.7.2/share/hadoop/common/

core-site.xml增加配置支持LZO压缩

同步core-site.xml

创建lzo文件的索引,lzo压缩文件的可切片特性依赖于其索引

hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /user/hive/warehouse/bigtable

建完索引时,查询时map个数变多

启动日志表ods_start_log创建,需要创建索引

创建事件日志表ods_event_log

Shell中单引号和双引号区别

(1)单引号不取变量值
(2)双引号取变量值
(3)反引号,执行引号中命令
(4)双引号内部嵌套单引号,取出变量值
(5)单引号内部嵌套双引号,不取出变量值

ODS层加载数据脚本(加载数据&加索引)

load data inpath '/origin_data/gmall/log/topic_event/$do_date' into table "$APP".ods_event_log partition(dt='$do_date');

$hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/gmall/ods/ods_start_log/dt=$do_date

四、数仓搭建之DWD层

 对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据,行式存储改为列存储,改压缩格式)

1、启动表

创建、导入数据、编写加载数据脚本,传递日期参数

2、DWD层事件表

基础明细表:存储明细数据

UDF和UDTF:

自定义UDF函数(解析公共字段)

自定义UDTF函数(解析具体事件字段)-获取事件、遍历、得到结果并返回

创建永久函数与开发好的java class关联

3、DWD层事件表获取

新添加字段

`entry` string,
`action` string,
`goodsid` string,
`showtype` string,
`news_staytime` string,
`loading_time` string,
`type1` string,
`category` string,

基础明细表:导入数据时调用编写的方法get_json_object(event_json,'$.kv.loading_way')

商品点击表

商品详情页表

商品列表页表

广告表

 获取json信息并加入

事件表加载数据脚本

五、业务知识准备

1、业务术语

活跃用户

沉默用户

版本分布

流失用户

留存用户

使用时长

2、系统函数

collect_set函数:把同一分组的不同行的数据聚合成一个集合 

hive (gmall)> select course, collect_set(area), avg(score) from stud group by course;
chinese ["sh","bj"]     79.0
math    ["bj"]  93.5

日期处理函数(datediff):date_format、date_add、next_day、last_day

当前周的周一:date_add(next_day('2019-02-12','MO'),-7)

3、需求实施流程

业务口径、技术口径、原型设计和评审、模型设计(分层建模)、数据开发、前后端开发、联调、测试、上线

以用户活跃需求为例,ods层需要存放start_log(启动日志),dwd层需要对数据进行清洗、过滤,dws层需要对数据进行轻度聚合,ads层需要得出最终统计指标的结果

六、需求一:用户活跃主题

1、DWS层
目标:统计当日(dau)、当周、当月活动的每个设备明细

以用户单日访问为key进行聚合group by mid_id;【`mid_id` string COMMENT '设备唯一标识'】

周活跃明细:

 导入数据

date_add(next_day('2019-12-14','MO'),-7),
date_add(next_day('2019-12-14','MO'),-1),
concat(date_add( next_day('2019-12-14','MO'),-7), '_' , date_add(next_day('2019-12-14','MO'),-1)
)

月活跃设备明细

2、ADS层

活跃设备数,加字段

hive (gmall)>
drop table if exists ads_uv_count;
create external table ads_uv_count( 
    `dt` string COMMENT '统计日期',
    `day_count` bigint COMMENT '当日用户数量',
    `wk_count`  bigint COMMENT '当周用户数量',
    `mn_count`  bigint COMMENT '当月用户数量',
    `is_weekend` string COMMENT 'Y,N是否是周末,用于得到本周最终结果',
    `is_monthend` string COMMENT 'Y,N是否是月末,用于得到本月最终结果' 
) COMMENT '活跃设备数'
row format delimited fields terminated by '\t'
location '/warehouse/gmall/ads/ads_uv_count/';

七、用户新增主题

1、DWS:每日新增设备明细表

 2、ADS层(每日新增设备表)

 八、用户留存主题

1、需求目标

 

 2、DWS层

DWS层(每日留存用户明细表)

 DWS层(1,2,3,n天留存用户明细表)

from dws_uv_detail_day ud join dws_new_mid_day nm  on ud.mid_id =nm.mid_id 
where ud.dt='2019-02-11' and nm.create_date=date_add('2019-02-11',-1)

union all

(1)union会将联合的结果集去重,效率较union all差
(2)union all不会对结果集去重,所以效率高

3、ADS层:留存用户数

hive (gmall)>
drop table if exists ads_user_retention_day_count;
create external table ads_user_retention_day_count 
(
   `create_date`       string  comment '设备新增日期',
   `retention_day`     int comment '截止当前日期留存天数',
   `retention_count`    bigint comment  '留存数量'
)  COMMENT '每日用户留存情况'
row format delimited fields terminated by '\t'
location '/warehouse/gmall/ads/ads_user_retention_day_count/';

留存用户比率

 九、新数据准备

分析沉默用户、本周回流用户数、流失用户、最近连续3周活跃用户、最近七天内连续三天活跃用户数,需要准备2019-02-12、2019-02-20日的数据

 十、沉默用户数

沉默用户:指的是只在安装当天启动过,且启动时间是在一周前

 ……

十一、总结

1、用户行为数仓业务总结

1)ODS层(原始数据层)
存储原始数据,直接加载原始日志、数据,数据保持原貌不做处理。
2)DWD层(明细层)
对ODS层数据进行清洗(去除空值、脏数据,超过极限范围的数据)
3)DWS层(服务数据层)
以DWD层为基础,进行轻度汇总。比如:用户当日、设备当日、商品当日。
4)ADS层(数据应用层)

2、Tez优点:将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。

2、在项目中是否自定义过UDF、UDTF函数,以及用他们处理了什么问题?

自定义过。
用UDF函数解析公共字段;用UDTF函数解析事件字段。

21.1.5 如何分析用户新增
用活跃用户表 left join 用户新增表,用户新增表中mid为空的即为用户新增。
21.1.6 如何分析用户1天留存
留存用户=前一天新增 join 今天活跃
用户留存率=留存用户/前一天新增
21.1.7 如何分析沉默用户?
按照设备id对日活表分组,登录次数为1,且是在一周前登录。
21.1.8 如何分析本周回流用户
本周活跃left join本周新增 left join上周活跃,且本周新增id和上周活跃id都为null
21.1.9 如何分析流失用户?
按照设备id对日活表分组,且七天内没有登录过。
21.1.10 如何分析最近连续3周活跃用户数?
按照设备id对周活进行分组,统计次数等于3次。
21.1.11 如何分析最近七天内连续三天活跃用户数?
1)查询出最近7天的活跃用户,并对用户活跃日期进行排名
2)计算用户活跃日期及排名之间的差值
3)对同用户及差值分组,统计差值个数
4)将差值相同个数大于等于3的数据取出,然后去重,即为连续3天及以上活跃的用户

整个文档中涉及的所有层级及表

 3、hive总结

窗口函数、排序函数

hive优化:分桶、小文件合并、map和reduce数量设置

常用参数设置

posted @ 2021-12-04 22:28  哥们要飞  阅读(460)  评论(0编辑  收藏  举报