分享

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

levycui 2020-12-23 20:04:47 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 2168
问题导读:
1、如何统计每个用户累计访问次数?
2、如何统计某天首次添加收藏的用户?
3、如何使用使用日志数据用户行为宽表作为DWS层表?
4、如何统计各个商品点击次数top3的用户?


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

第15章 需求九:每个用户累计访问次数
结果如下
  1. 用户    日期                小计    总计
  2. mid1    2019-12-14        10        10
  3. mid1    2019-02-11        12        22
  4. mid2    2019-12-14        15        15
  5. mid2    2019-02-11        12        27
复制代码


15.1 DWS层
15.1.1 建表语句
  1. hive (gmall)>
  2. drop table if exists dws_user_total_count_day;
  3. create external table dws_user_total_count_day(
  4.     `mid_id` string COMMENT '设备id',
  5. `subtotal` bigint COMMENT '每日登录小计'
  6. )
  7. partitioned by(`dt` string)
  8. row format delimited fields terminated by '\t'
  9. location '/warehouse/gmall/dws/dws_user_total_count_day';
复制代码


15.1.2 导入数据
1)导入数据
  1. insert overwrite table dws_user_total_count_day
  2. partition(dt='2019-12-14')
  3. select
  4.     mid_id,
  5.     count(mid_id) cm
  6. from
  7. dwd_start_log
  8. where
  9.     dt='2019-12-14'
  10. group by
  11.     mid_id;
复制代码

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


15.1.3 数据导入脚本
1)在/home/kgg/bin目录下创建脚本dws_user_total_count_day.sh
  1. [kgg@hadoop102 bin]$ vim dws_user_total_count_day.sh
  2. 在脚本中填写如下内容
  3. #!/bin/bash
  4. # 定义变量方便修改
  5. APP=gmall
  6. hive=/opt/module/hive/bin/hive
  7. hadoop=/opt/module/hadoop-2.7.2/bin/hadoop
  8. # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
  9. if [ -n "$1" ] ;then
  10.    do_date=$1
  11. else
  12.    do_date=`date -d "-1 day" +%F`
  13. fi
  14. echo "===日志日期为 $do_date==="
  15. sql="
  16. insert overwrite table "$APP".dws_user_total_count_day partition(dt='$do_date')
  17. select
  18.     mid_id,
  19.     count(mid_id) cm
  20. from
  21.     "$APP".dwd_start_log
  22. where
  23.     dt='$do_date'
  24. group by
  25.     mid_id,dt;
  26. "
  27. $hive -e "$sql"
复制代码

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

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

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

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

15.2 ADS层
15.2.1 建表语句
  1. drop table if exists ads_user_total_count;
  2. create external table ads_user_total_count(
  3.     `mid_id` string COMMENT '设备id',
  4.     `subtotal` bigint COMMENT '每日登录小计',
  5.     `total` bigint COMMENT '登录次数总计'
  6. )
  7. partitioned by(`dt` string)
  8. row format delimited fields terminated by '\t'
  9. location '/warehouse/gmall/ads/ads_user_total_count';
复制代码


15.2.2 导入数据
  1. insert overwrite table ads_user_total_count partition(dt='2019-10-03')
  2. select
  3.   if(today.mid_id is null, yesterday.mid_id, today.mid_id) mid_id,
  4.   today.subtotal,
  5.   if(today.subtotal is null, 0, today.subtotal) + if(yesterday.total is null, 0, yesterday.total) total
  6. from (
  7.   select
  8.     *
  9.   from dws_user_total_count_day
  10.   where dt='2019-10-03'
  11. ) today
  12. full join (
  13.   select
  14.     *
  15.   from ads_user_total_count
  16.   where dt=date_add('2019-10-03', -1)
  17. ) yesterday
  18. on today.mid_id=yesterday.mid_id
复制代码


15.2.3 数据导入脚本
1)在hadoop102的/home/kgg/bin目录下创建脚本
  1. [kgg@hadoop102 bin]$ vim ads_user_total_count.sh
  2. 在脚本中编写如下内容
  3. #!/bin/bash
  4. db=gmall
  5. hive=/opt/module/hive-1.2.1/bin/hive
  6. hadoop=/opt/module/hadoop-2.7.2/bin/hadoop
  7. if [[ -n $1 ]]; then
  8.     do_date=$1
  9. else
  10.     do_date=`date -d '-1 day' +%F`
  11. fi
  12. sql="
  13. use gmall;
  14. insert overwrite table ads_user_total_count partition(dt='$do_date')
  15. select
  16.   if(today.mid_id is null, yesterday.mid_id, today.mid_id) mid_id,
  17.   today.subtotal,
  18.   if(today.subtotal is null, 0, today.subtotal) + if(yesterday.total is null, 0, yesterday.total) total
  19. from (
  20.   select
  21.     *
  22.   from dws_user_total_count_day
  23.   where dt='$do_date'
  24. ) today
  25. full join (
  26.   select
  27.     *
  28.   from ads_user_total_count
  29.   where dt=date_add('$do_date', -1)
  30. ) yesterday
  31. on today.mid_id=yesterday.mid_id
  32. "
  33. $hive -e "$sql"
复制代码

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

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

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

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

第16章 需求十:新收藏用户数
新收藏用户:指的是在某天首次添加收藏的用户

16.1 DWS层建立用户日志行为宽表
考虑到后面的多个需求会同时用到多张表中的数据, 如果每次都join操作, 则影响查询的效率. 可以先提前做一张宽表, 提高其他查询的执行效率.

每个用户对每个商品的点击次数, 点赞次数, 收藏次数
16.1.1 建表语句
  1. drop table if exists dws_user_action_wide_log;
  2. CREATE EXTERNAL TABLE dws_user_action_wide_log(
  3.     `mid_id` string COMMENT '设备id',
  4.     `goodsid` string COMMENT '商品id',
  5.     `display_count` string COMMENT '点击次数',
  6.     `praise_count` string COMMENT '点赞次数',
  7.     `favorite_count` string COMMENT '收藏次数')
  8. PARTITIONED BY (`dt` string)
  9. stored as parquet
  10. location '/warehouse/gmall/dws/dws_user_action_wide_log/'
  11. TBLPROPERTIES('parquet.compression'='lzo');
复制代码


16.1.2 导入数据
  1. insert overwrite table dws_user_action_wide_log partition(dt='2019-12-14')
  2. select
  3.     mid_id,
  4.     goodsid,
  5.     sum(display_count) display_count,
  6.     sum(praise_count) praise_count,
  7.     sum(favorite_count) favorite_count
  8. from
  9. ( select
  10.         mid_id,
  11.         goodsid,
  12.         count(*) display_count,
  13.         0 praise_count,
  14.         0 favorite_count
  15.     from
  16.         dwd_display_log
  17.     where
  18.         dt='2019-12-14' and action=2
  19.     group by
  20.         mid_id,goodsid
  21.     union all
  22.     select
  23.         mid_id,
  24.         target_id goodsid,
  25.         0,
  26.         count(*) praise_count,
  27.         0
  28.     from
  29.         dwd_praise_log
  30.     where
  31.         dt='2019-12-14'
  32.     group by
  33.         mid_id,target_id
  34.     union all
  35.     select
  36.         mid_id,
  37.         course_id goodsid,
  38.         0,
  39.         0,
  40.         count(*) favorite_count
  41.     from
  42.         dwd_favorites_log
  43.     where
  44.         dt='2019-12-14'
  45.     group by
  46.         mid_id,course_id
  47. )user_action
  48. group by
  49. mid_id,goodsid;
复制代码


16.1.3 数据导入脚本
  1. [kgg@hadoop102 bin]$ vi dws_user_action_wide_log.sh
  2. [kgg@hadoop102 bin]$ chmod 777 dws_user_action_wide_log.sh
  3. #!/bin/bash
  4. db=gmall
  5. hive=/opt/module/hive-1.2.1/bin/hive
  6. hadoop=/opt/module/hadoop-2.7.2/bin/hadoop
  7. if [[ -n $1 ]]; then
  8.     do_date=$1
  9. else
  10.     do_date=`date -d '-1 day' +%F`
  11. fi
  12. sql="
  13. use gmall;
  14. insert overwrite table dws_user_action_wide_log partition(dt='$do_date')
  15. select
  16.     mid_id,
  17.     goodsid,
  18.     sum(display_count) display_count,
  19.     sum(praise_count) praise_count,
  20.     sum(favorite_count) favorite_count
  21. from
  22. ( select
  23.         mid_id,
  24.         goodsid,
  25.         count(*) display_count,
  26.         0 praise_count,
  27.         0 favorite_count
  28.     from
  29.         dwd_display_log
  30.     where
  31.         dt='$do_date' and action=2
  32.     group by
  33.         mid_id,goodsid
  34.     union all
  35.     select
  36.         mid_id,
  37.         target_id goodsid,
  38.         0,
  39.         count(*) praise_count,
  40.         0
  41.     from
  42.         dwd_praise_log
  43.     where
  44.         dt='$do_date'
  45.     group by
  46.         mid_id,target_id
  47.     union all
  48.     select
  49.         mid_id,
  50.         course_id goodsid,
  51.         0,
  52.         0,
  53.         count(*) favorite_count
  54.     from
  55.         dwd_favorites_log
  56.     where
  57.         dt='$do_date'
  58.     group by
  59.         mid_id,course_id
  60. )user_action
  61. group by
  62. mid_id,goodsid;
  63. "
  64. $hive -e "$sql"
复制代码

16.2 DWS层
使用日志数据用户行为宽表作为DWS层表
16.3 ADS层
16.3.1 建表语句
  1. drop table if exists ads_new_favorites_mid_day;
  2. create external table ads_new_favorites_mid_day(
  3.     `dt` string COMMENT '日期',
  4.     `favorites_users` bigint COMMENT '新收藏用户数'
  5. )
  6. row format delimited fields terminated by '\t'
  7. location '/warehouse/gmall/ads/ads_new_favorites_mid_day';
复制代码


16.3.2 导入数据
  1. insert into table ads_new_favorites_mid_day
  2. select
  3.     '2019-12-14' dt,
  4.     count(*) favorites_users
  5. from
  6. (
  7.     select
  8.         mid_id
  9.     from
  10.         dws_user_action_wide_log
  11.     where
  12.         favorite_count>0
  13.     group by
  14.         mid_id
  15.     having
  16.         min(dt)='2019-12-14'
  17. )user_favorite;
复制代码


16.3.3 数据导入脚本
1)在/home/kgg/bin目录下创建脚本ads_new_favorites_mid_day.sh
  1. [kgg@hadoop102 bin]$ vim ads_new_favorites_mid_day.sh
  2. 在脚本中填写如下内容
  3. #!/bin/bash
  4. # 定义变量方便修改
  5. APP=gmall
  6. hive=/opt/module/hive/bin/hive
  7. hadoop=/opt/module/hadoop-2.7.2/bin/hadoop
  8. # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
  9. if [ -n "$1" ] ;then
  10.    do_date=$1
  11. else
  12.    do_date=`date -d "-1 day" +%F`
  13. fi
  14. echo "===日志日期为 $do_date==="
  15. sql="
  16. insert into table "$APP".ads_new_favorites_mid_day
  17. select
  18.     '$do_date' dt,
  19.     count(*) favorites_users
  20. from
  21. (
  22.     select
  23.         mid_id
  24.     from
  25.         "$APP".dws_user_action_wide_log
  26.     where
  27.         favorite_count>0
  28.     group by
  29.         mid_id
  30.     having
  31.         min(dt)='$do_date'
  32. )user_favorite;
  33. "
  34. $hive -e "$sql"
复制代码

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

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

4)查询结果
  1. hive (gmall)> select * from ads_new_favorites_mid_day;
复制代码
5)脚本执行时间
企业开发中一般在每天凌晨30分~1点

第17章 需求十一:各个商品点击次数top3的用户
17.1 DWS层
使用日志数据用户行为宽表作为DWS层表

17.2 ADS层
17.2.1 建表语句
  1. drop table if exists ads_goods_count;
  2. create external table ads_goods_count(
  3.     `dt` string COMMENT '统计日期',
  4.     `goodsid` string COMMENT '商品',
  5.     `user_id` string COMMENT '用户',
  6.     `goodsid_user_count` bigint COMMENT '商品用户点击次数'
  7. )
  8. row format delimited fields terminated by '\t'
  9. location '/warehouse/gmall/ads/ads_goods_count';
  10. 17.2.2 导入数据
  11. insert into table ads_goods_count
  12. select
  13.     '2019-10-03',
  14.     goodsid,
  15.     mid_id,
  16.     sum_display_count
  17. from(
  18.     select
  19.       goodsid,
  20.       mid_id,
  21.       sum_display_count,
  22.       row_number() over(partition by goodsid order by sum_display_count desc) rk
  23.     from(
  24.       select
  25.         goodsid,
  26.         mid_id,
  27.         sum(display_count) sum_display_count
  28.       from dws_user_action_wide_log
  29.       where display_count>0
  30.       group by goodsid, mid_id
  31.     ) t1
  32. ) t2
  33. where rk <= 3
复制代码


17.2.3 数据导入脚本
1)在/home/kgg/bin目录下创建脚本ads_goods_count.sh
  1. [kgg@hadoop102 bin]$ vim ads_goods_count.sh
  2. 在脚本中填写如下内容
  3. #!/bin/bash
  4. db=gmall
  5. hive=/opt/module/hive/bin/hive
  6. hadoop=/opt/module/hadoop/bin/hadoop
  7. if [[ -n $1 ]]; then
  8.     do_date=$1
  9. else
  10.     do_date=`date -d '-1 day' +%F`
  11. fi
  12. sql="
  13. use gmall;
  14. insert into table ads_goods_count
  15. select
  16.     '$do_date',
  17.     goodsid,
  18.     mid_id,
  19.     sum_display_count
  20. from(
  21.     select
  22.       goodsid,
  23.       mid_id,
  24.       sum_display_count,
  25.       row_number() over(partition by goodsid order by sum_display_count desc) rk
  26.     from(
  27.       select
  28.         goodsid,
  29.         mid_id,
  30.         sum(display_count) sum_display_count
  31.       from dws_user_action_wide_log
  32.       where display_count>0
  33.       group by goodsid, mid_id
  34.     ) t1
  35. ) t2
  36. where rk <= 3
  37. "
  38. $hive -e "$sql"
复制代码

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

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

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

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


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


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

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

本版积分规则

关闭

推荐上一条 /2 下一条