1. 程式人生 > 實用技巧 >大資料實戰(四十):電商數倉(三十三)之使用者行為資料倉庫(十九)新收藏使用者數

大資料實戰(四十):電商數倉(三十三)之使用者行為資料倉庫(十九)新收藏使用者數

新收藏使用者:指的是在某天首次新增收藏的使用者

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"