分享

大数据项目之电商数仓(总结)(十二):用户行为数据仓库

问题导读:
1、如何统计最近7天未登录的用户?
2、如何使用周活明细表dws_uv_detail_wk输出数据?
3、如何统计最近连续三周活跃用户数?
4、如何使用日活明细表dws_uv_detail_day输出数据?



上一篇:大数据项目之电商数仓(总结)(十一):用户行为数据仓库

第12章 需求六:流失用户数
流失用户:最近7天未登录我们称之为流失用户

12.1 DWS层
使用日活明细表dws_uv_detail_day作为DWS层数据

12.2 ADS层


2020-12-22_201556.jpg

1)建表语句
  1. hive (gmall)>
  2. drop table if exists ads_wastage_count;
  3. create external table ads_wastage_count(
  4.     `dt` string COMMENT '统计日期',
  5.     `wastage_count` bigint COMMENT '流失设备数'
  6. )
  7. row format delimited fields terminated by '\t'
  8. location '/warehouse/gmall/ads/ads_wastage_count';
复制代码

2)导入2019-02-20数据
  1. hive (gmall)>
  2. insert into table ads_wastage_count
  3. select
  4.      '2019-02-20',
  5.      count(*)
  6. from
  7. (
  8.     select mid_id
  9. from dws_uv_detail_day
  10.     group by mid_id
  11.     having max(dt)<=date_add('2019-02-20',-7)
  12. )t1;
复制代码


12.3 编写脚本
1)在hadoop102的/home/kgg/bin目录下创建脚本
  1. [kgg@hadoop102 bin]$ vim ads_wastage_log.sh
  2.     在脚本中编写如下内容
  3. #!/bin/bash
  4. if [ -n "$1" ];then
  5.     do_date=$1
  6. else
  7.     do_date=`date -d "-1 day" +%F`
  8. fi
  9. hive=/opt/module/hive/bin/hive
  10. APP=gmall
  11. echo "-----------导入日期$do_date-----------"
  12. sql="
  13. insert into table "$APP".ads_wastage_count
  14. select
  15.      '$do_date',
  16.      count(*)
  17. from
  18. (
  19.     select mid_id
  20.     from "$APP".dws_uv_detail_day
  21.     group by mid_id
  22.     having max(dt)<=date_add('$do_date',-7)
  23. )t1;"
  24. $hive -e "$sql"
复制代码

2)增加脚本执行权限
  1. [kgg@hadoop102 bin]$ chmod 777 ads_wastage_log.sh
复制代码

3)脚本使用
  1. [kgg@hadoop102 module]$ ads_wastage_log.sh 2019-02-20
复制代码

4)查询结果
  1. hive (gmall)> select * from ads_wastage_count;
复制代码

5)脚本执行时间
企业开发中一般在每日凌晨30分~1点

第13章 需求七:最近连续三周活跃用户数
最近3周连续活跃的用户:通常是周一对前3周的数据做统计,该数据一周计算一次。

13.1 DWS层
使用周活明细表dws_uv_detail_wk作为DWS层数据

13.2 ADS层

2020-12-22_201631.jpg

1)建表语句
  1. hive (gmall)>
  2. drop table if exists ads_continuity_wk_count;
  3. create external table ads_continuity_wk_count(
  4.     `dt` string COMMENT '统计日期,一般用结束周周日日期,如果每天计算一次,可用当天日期',
  5.     `wk_dt` string COMMENT '持续时间',
  6.     `continuity_count` bigint
  7. )
  8. row format delimited fields terminated by '\t'
  9. location '/warehouse/gmall/ads/ads_continuity_wk_count';
复制代码

2)导入2019-02-20所在周的数据
  1. hive (gmall)>
  2. insert into table ads_continuity_wk_count
  3. select
  4.      '2019-02-20',
  5.      concat(date_add(next_day('2019-02-20','MO'),-7*3),'_',date_add(next_day('2019-02-20','MO'),-1)),
  6.      count(*)
  7. from
  8. (
  9.     select mid_id
  10.     from dws_uv_detail_wk
  11.     where wk_dt>=concat(date_add(next_day('2019-02-20','MO'),-7*3),'_',date_add(next_day('2019-02-20','MO'),-7*2-1))
  12.     and wk_dt<=concat(date_add(next_day('2019-02-20','MO'),-7),'_',date_add(next_day('2019-02-20','MO'),-1))
  13.     group by mid_id
  14.     having count(*)=3
  15. )t1;
复制代码

3)查询
  1. hive (gmall)> select * from ads_continuity_wk_count;
复制代码

13.3 编写脚本
1)在hadoop102的/home/kgg/bin目录下创建脚本
  1. [kgg@hadoop102 bin]$ vim ads_continuity_wk_log.sh
  2.     在脚本中编写如下内容
  3. #!/bin/bash
  4. if [ -n "$1" ];then
  5.     do_date=$1
  6. else
  7.     do_date=`date -d "-1 day" +%F`
  8. fi
  9. hive=/opt/module/hive/bin/hive
  10. APP=gmall
  11. echo "-----------导入日期$do_date-----------"
  12. sql="
  13. insert into table "$APP".ads_continuity_wk_count
  14. select
  15.      '$do_date',
  16.      concat(date_add(next_day('$do_date','MO'),-7*3),'_',date_add(next_day('$do_date','MO'),-1)),
  17.      count(*)
  18. from
  19. (
  20.     select mid_id
  21.     from "$APP".dws_uv_detail_wk
  22.     where wk_dt>=concat(date_add(next_day('$do_date','MO'),-7*3),'_',date_add(next_day('$do_date','MO'),-7*2-1))
  23.     and wk_dt<=concat(date_add(next_day('$do_date','MO'),-7),'_',date_add(next_day('$do_date','MO'),-1))
  24.     group by mid_id
  25.     having count(*)=3
  26. )t1;"
  27. $hive -e "$sql"
复制代码

2)增加脚本执行权限
  1. [kgg@hadoop102 bin]$ chmod 777 ads_continuity_wk_log.sh
复制代码

3)脚本使用
  1. [kgg@hadoop102 module]$ ads_continuity_wk_log.sh 2019-02-20
复制代码

4)查询结果
  1. hive (gmall)> select * from ads_continuity_wk_count;
复制代码

5)脚本执行时间
企业开发中一般在每周一凌晨30分~1点


第14章 需求八:最近七天内连续三天活跃用户数
说明:最近7天内连续3天活跃用户数

14.1 DWS层
使用日活明细表dws_uv_detail_day作为DWS层数据

14.2 ADS层
2020-12-22_201740.jpg

1)建表语句
  1. hive (gmall)>
  2. drop table if exists ads_continuity_uv_count;
  3. create external table ads_continuity_uv_count(
  4.     `dt` string COMMENT '统计日期',
  5.     `wk_dt` string COMMENT '最近7天日期',
  6.     `continuity_count` bigint
  7. ) COMMENT '连续活跃设备数'
  8. row format delimited fields terminated by '\t'
  9. location '/warehouse/gmall/ads/ads_continuity_uv_count';
复制代码

2)写出导入数据的SQL语句
  1. hive (gmall)>
  2. insert into table ads_continuity_uv_count
  3. select
  4.     '2019-02-12',
  5.     concat(date_add('2019-02-12',-6),'_','2019-02-12'),
  6.     count(*)
  7. from
  8. (
  9.     select mid_id
  10.     from
  11.     (
  12.         select mid_id      
  13.         from
  14.         (
  15.             select
  16.                 mid_id,
  17.                 date_sub(dt,rank) date_dif
  18.             from
  19.             (
  20.                 select
  21.                     mid_id,
  22.                     dt,
  23.                     rank() over(partition by mid_id order by dt) rank
  24.                 from dws_uv_detail_day
  25.                 where dt>=date_add('2019-02-12',-6) and dt<='2019-02-12'
  26.             )t1
  27.         )t2
  28.         group by mid_id,date_dif
  29.         having count(*)>=3
  30.     )t3
  31.     group by mid_id
  32. )t4;
复制代码

3)查询
  1. hive (gmall)> select * from ads_continuity_uv_count;
复制代码

14.3 编写脚本
1)在hadoop102的/home/kgg/bin目录下创建脚本
  1. [kgg@hadoop102 bin]$ vim ads_continuity_log.sh
  2.     在脚本中编写如下内容
  3. #!/bin/bash
  4. if [ -n "$1" ];then
  5.     do_date=$1
  6. else
  7.     do_date=`date -d "-1 day" +%F`
  8. fi
  9. hive=/opt/module/hive/bin/hive
  10. APP=gmall
  11. echo "-----------导入日期$do_date-----------"
  12. sql="
  13. insert into table "$APP".ads_continuity_uv_count
  14. select
  15.      '$do_date',
  16.      concat(date_add('$do_date',-6),'_','$do_date') dt,
  17.      count(*)
  18. from
  19. (
  20.     select mid_id
  21.     from
  22.     (
  23.         select mid_id
  24.         from
  25.         (
  26.             select
  27.                 mid_id,
  28.                 date_sub(dt,rank) date_diff
  29.             from
  30.             (
  31.                 select
  32.                     mid_id,
  33.                     dt,
  34.                     rank() over(partition by mid_id order by dt) rank
  35.                 from "$APP".dws_uv_detail_day
  36.                 where dt>=date_add('$do_date',-6) and dt<='$do_date'
  37.             )t1
  38.         )t2
  39.         group by mid_id,date_diff
  40.         having count(*)>=3
  41.     )t3
  42.     group by mid_id
  43. )t4;
  44. "
  45. $hive -e "$sql"
复制代码

2)增加脚本执行权限
  1. [kgg@hadoop102 bin]$ chmod 777 ads_continuity_log.sh
复制代码

3)脚本使用
  1. [kgg@hadoop102 module]$ ads_continuity_log.sh 2019-02-12
复制代码

4)查询结果
  1. hive (gmall)> select * from ads_continuity_uv_count;
复制代码

5)脚本执行时间
企业开发中一般在每日凌晨30分~1点


最新经典文章,欢迎关注公众号


没找到任何评论,期待你打破沉寂

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

本版积分规则

关闭

推荐上一条 /2 下一条