大資料實戰(四十):電商數倉(三十三)之使用者行為資料倉庫(十九)新收藏使用者數
新收藏使用者:指的是在某天首次新增收藏的使用者
1 DWS層建立使用者日誌行為寬表
考慮到後面的多個需求會同時用到多張表中的資料,如果每次都join操作,則影響查詢的效率.可以先提前做一張寬表,提高其他查詢的執行效率.
每個使用者對每個商品的點選次數,點贊次數,收藏次數
1.1 建表語句
drop table if exists dws_user_action_wide_log; CREATE EXTERNAL TABLE dws_user_action_wide_log( `mid_id` string COMMENT '裝置id', `goodsid` string COMMENT '商品id', `display_count` string COMMENT '點選次數', `praise_count` string COMMENT '點贊次數', `favorite_count` string COMMENT '收藏次數') PARTITIONED BY (`dt` string) stored as parquet location '/warehouse/gmall/dws/dws_user_action_wide_log/' TBLPROPERTIES('parquet.compression'='lzo');View Code
1.2 匯入資料
-----------------------------需求 DWS層建立使用者日誌行為寬表----------------------- -----------------------------相關表--------------------- dwd_display_log(商品點選表):mid_id(使用者),goodsid(商品id) dwd_favorites_log(收藏表):mid_id(使用者),course_id(商品id) dwd_praise_log(點贊表): mid_id(使用者),target_id(商品id) -----------------------------思路----------------------- 講使用者對每個商品的點選次數,點贊次數,收藏次數等資訊彙總到一張寬表中! 從以上三個表中,先以使用者和商品為單位,進行聚合! 從以上三個表中取資料,根據mid_id和商品進行關聯!將三個表的資訊彙總合併! 合併: 常用join,使用join進行連線操作! 在hive中儘量少用join! -----------------------------SQL------------------------ insert overwrite TABLE dws_user_action_wide_log PARTITION(dt='2020-02-17') select mid_id, goodsid, sum(display_count), sum(praise_count), sum(favorite_count) from (select mid_id,goodsid,count(*) display_count,0 praise_count, 0 favorite_count from dwd_display_log where dt='2020-02-17' group by mid_id,goodsid union all SELECT mid_id,target_id goodsid,0 display_count ,count(*) praise_count,0 favorite_count from dwd_praise_log where dt='2020-02-17' group by mid_id,target_id union all select mid_id,course_id goodsid, 0 display_count,0 praise_count, count(*) favorite_count from dwd_favorites_log where dt='2020-02-17' group by mid_id,course_id) tmp GROUP by mid_id,goodsid
2 DWS層
使用日誌資料使用者行為寬表作為DWS層表
3 ADS層
3.1 建表語句
drop table if exists ads_new_favorites_mid_day; create external table ads_new_favorites_mid_day( `dt` string COMMENT '日期', `favorites_users` bigint COMMENT '新收藏使用者數' ) row format delimited fields terminated by '\t' location '/warehouse/gmall/ads/ads_new_favorites_mid_day';View Code
3.2 匯入資料
-----------------------------需求 ads_new_favorites_mid_day統計每天的新收藏使用者數-----------------------
-----------------------------相關表---------------------
dws_user_action_wide_log: 使用者行為寬表
統計的是每個使用者對每個商品的點贊,點選和收藏的次數
-----------------------------思路-----------------------
從dws_user_action_wide_log,取出收藏的次數>0的記錄,按使用者分組,求此使用者是否是新使用者
新使用者: 在所有使用了收藏功能的日期中,取日期最早(小)的,如果這個日期等於今天,
那麼說明當前使用者是第一天使用收藏,就是新使用者!
-----------------------------SQL------------------------
insert into table ads_new_favorites_mid_day
select
'2020-02-17',
count(*)
from
(select
mid_id
from dws_user_action_wide_log
where favorite_count>0
group by mid_id
having MIN(dt)='2020-02-17') tmp
3.3 資料匯入指令碼
ads_new_favorites_mid_day.sh
#!/bin/bash
if [ -n "$1" ]
then
do_date=$1
else
do_date=$(date -d yesterday +%F)
fi
echo ===日誌日期為$do_date===
sql="
use gmall;
insert into table ads_new_favorites_mid_day
select
'$do_date',
count(*)
from
(select
mid_id
from dws_user_action_wide_log
where favorite_count>0
group by mid_id
having MIN(dt)='$do_date') tmp
"
hive -e "$sql"