Bootstrap

数仓搭建-ADS层

7.1 新数据生成
1)重启行为数据通道

[atguigu@hadoop102 module]$ cluster.sh stop
[atguigu@hadoop102 module]$ cluster.sh start

2)修改/opt/module/applog下的application.properties

#业务日期
mock.date=2020-06-16

注意:分发至其他需要生成数据的节点

[atguigu@hadoop102 applog]$ xsync application.properties

3)生成数据

[atguigu@hadoop102 bin]$ lg.sh

注意:生成数据之后,记得查看HDFS数据是否存在!
4)导入数据至ODS层

[atguigu@hadoop102 bin]$ hdfs_to_ods_log.sh 2020-06-16

5)导入数据至DWD层

[atguigu@hadoop102 bin]$ ods_to_dwd_log.sh 2020-06-16

6)导入数据至DWS层

[atguigu@hadoop102 bin]$ dwd_to_dws.sh 2020-06-16

7)导入数据至DWT层

[atguigu@hadoop102 bin]$ dws_to_dwt.sh 2020-06-16

8)修改application.properties

#业务日期
mock.date=2020-06-25

重复前面3-7步即可!
7.2 设备主题
7.2.1 活跃设备数(日、周、月)
需求定义:
日活:当日活跃的设备数
周活:当周活跃的设备数
月活:当月活跃的设备数
1)建表语句

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/';

Ads层的表,没有分区,没有列式存储,没有压缩,就是一张普通表
主要是ads层的表的数据量会非常少。一天就一条或者几条数据。
而且Ads层的数据最终会导出到mysql,去做可视化展示。而往mysql导数据只能全表导。也不会只选择几个列,所以没有列式存储
2)导入数据

hive (gmall)>
insert into table ads_uv_count 
select  
    '2020-07-31' dt,
    daycount.ct,
    wkcount.ct,
    mncount.ct,
    if(date_add(next_day('2020-07-31','MO'),-1)='2020-07-31','Y','N') ,
    if(last_day('2020-07-31')='2020-07-31','Y','N') 
from 
(
    select  
        '2020-07-31' dt,
        count(*) ct
    from dwt_uv_topic
    where login_date_last='2020-07-31'  
)daycount join 
( 
    select  
        '2020-07-31' dt,
        count (*) ct
    from dwt_uv_topic
    where login_date_last>=date_add(next_day('2020-07-31','MO'),-7) 
    and login_date_last<= date_add(next_day('2020-07-31','MO'),-1) 
) wkcount on daycount.dt=wkcount.dt
join 
( 
    select  
        '2020-07-31' dt,
        count (*) ct
    from dwt_uv_topic
    where date_format(login_date_last,'yyyy-MM')=date_format('2020-07-31','yyyy-MM')  
)mncount on daycount.dt=mncount.dt;

next_day('2020-07-31','MO'),-7。求本周一:下周一 -7
next_day('2020-07-31','MO'),-1。求本周日:下周一 -1
last_day('2020-07-11')。得到本月月末

3)查询导入结果

hive (gmall)> select * from ads_uv_count;

7.2.2 每日新增设备
1)建表语句

hive (gmall)>
drop table if exists ads_new_mid_count;
create external table ads_new_mid_count
(
    `create_date`     string comment '创建时间' ,
    `new_mid_count`   BIGINT comment '新增设备数量' 
)  COMMENT '每日新增设备数量'
row format delimited fields terminated by '\t'
location '/warehouse/gmall/ads/ads_new_mid_count/';

2)导入数据

hive (gmall)>
insert into table ads_new_mid_count 
select
    '2020-07-31',
    count(*)
from dwt_uv_topic
where login_date_first='2020-07-31';

3)查询导入数据

hive (gmall)> select * from ads_new_mid_count;

7.2.3 留存率

1)建表语句

hive (gmall)>
drop table if exists ads_user_retention_day_rate;
create external table ads_user_retention_day_rate 
(
     `stat_date`          string comment '统计日期',
     `create_date`       string  comment '设备新增日期',
     `retention_day`     int comment '截止当前日期留存天数',
     `retention_count`    bigint comment  '留存数量',
     `new_mid_count`     bigint comment '设备新增数量',
     `retention_ratio`   decimal(16,2) comment '留存率'
)  COMMENT '留存率'
row format delimited fields terminated by '\t'
location '/warehouse/gmall/ads/ads_user_retention_day_rate/';
统计日期为计算日期的前一天。因为计算的时候只能拿到前一天的数据

2)导入数据

hive (gmall)>
insert into table ads_user_retention_day_rate
select
    '2020-08-01',
    date_add('2020-08-01',-1),
    1,--留存天数
    sum(if(login_date_first=date_add('2020-08-01',-1) and login_date_last='2020-08-01',1,0)),
    sum(if(login_date_first=date_add('2020-08-01',-1),1,0)),
    sum(if(login_date_first=date_add('2020-08-01',-1) and login_date_last='2020-08-01',1,0))/sum(if(login_date_first=date_add('2020-08-01',-1),1,0))*100
from dwt_uv_topic

union all

select
    '2020-08-01',
    date_add('2020-08-01',-2),
    2,--留存天数
    sum(if(login_date_first=date_add('2020-08-01',-2) and login_date_last='2020-08-01',1,0)),--留存数量
    sum(if(login_date_first=date_add('2020-08-01',-2),1,0)),--设备新增数量
    sum(if(login_date_first=date_add('2020-08-01',-2) and login_date_last='2020-08-01',1,0))/sum(if(login_date_first=date_add('2020-08-01',-2),1,0))*100 --留存率 = 留存数量/设备新增数量
from dwt_uv_topic

union all

select
    '2020-08-01',
    date_add('2020-08-01',-3),
    3,
    sum(if(login_date_first=date_add('2020-08-01',-3) and login_date_last='2020-08-01',1,0)),
    sum(if(login_date_first=date_add('2020-08-01',-3),1,0)),
    sum(if(login_date_first=date_add('2020-08-01',-3) and login_date_last='2020-08-01',1,0))/sum(if(login_date_first=date_add('2020-08-01',-3),1,0))*100
from dwt_uv_topic;

8.1号来统计
2020-07-311日留存率
2020-07-302日留存率
2020-07-293日留存率

3)查询导入数据

hive (gmall)>select * from ads_user_retention_day_rate;

7.2.4 沉默用户数
需求定义:
沉默用户:只在安装当天启动过,且启动时间是在7天前
1)建表语句

hive (gmall)>
drop table if exists ads_silent_count;
create external table ads_silent_count( 
    `dt` string COMMENT '统计日期',
    `silent_count` bigint COMMENT '沉默设备数'
) COMMENT '沉默用户数'
row format delimited fields terminated by '\t'
location '/warehouse/gmall/ads/ads_silent_count';

2)导入2020-06-25数据

hive (gmall)>
insert into table ads_silent_count
select
    '2020-06-25',
    count(*) 
from dwt_uv_topic
where login_date_first=login_date_last
and login_date_last<=date_add('2020-06-25',-7);

3)查询导入数据

hive (gmall)> select * from ads_silent_count;

7.2.5 本周回流用户数
需求定义:
本周回流用户:上周未活跃,本周活跃的设备,且不是本周新增设备
1)建表语句

hive (gmall)>
drop table if exists ads_back_count;
create external table ads_back_count( 
    `dt` string COMMENT '统计日期',
    `wk_dt` string COMMENT '统计日期所在周',
    `wastage_count` bigint COMMENT '回流设备数'
) COMMENT '本周回流用户数'
row format delimited fields terminated by '\t'
location '/warehouse/gmall/ads/ads_back_count';

只有周日得到的数据是完整的
统计周:用周一的日期拼接周日的日期
2)导入数据:

hive (gmall)> 
insert into table ads_back_count
select
    '2020-06-25',
    concat(date_add(next_day('2020-06-25','MO'),-7),'_', date_add(next_day('2020-06-25','MO'),-1)),
    count(*)
from
(
    select
        mid_id
    from dwt_uv_topic
    where login_date_last>=date_add(next_day('2020-06-25','MO'),-7) 
    and login_date_last<= date_add(next_day('2020-06-25','MO'),-1)
    and login_date_first<date_add(next_day('2020-06-25','MO'),-7)
)current_wk
left join
(
    select
        mid_id
    from dws_uv_detail_daycount
    where dt>=date_add(next_day('2020-06-25','MO'),-7*2) 
    and dt<= date_add(next_day('2020-06-25','MO'),-7
;