一、漏斗分析
先看漏斗的效果
其实就是根据用户的行为一层一层分析用户的转化率。
活跃–>商品详情页–>下单–>支付
每一个指标对应的表:
活跃:dws_user_active_history
商品详情页:dwd_good_item
下单:dwd_user_order
支付:dwd_user_order
二、思路
首先统计当天活跃用户数量。
接着统计当天进入了多少个商品详情页。
接着统计当天下单的数量。
最后统计当天支付的数量。
并且计算每一层的转化率。
最终把结果数据保存到表app_user_conver_funnel中。
三、app层
1、app_user_conver_funnel
(1)源表
SQL
(2)建表语句
create external table if not exists app_mall.app_user_conver_funnel(
active_num int,
item_num int,
order_num int,
pay_num int,
active_to_item_ratio decimal(10,2),
item_to_order_ratio decimal(10,2),
order_to_pay_ratio decimal(10,2)
)partitioned by(dt string)
row format delimited
fields terminated by '\t'
location 'hdfs://bigdata01:9000/data/app/user_conver_funnel/';
(3)映射关系
insert overwrite table app_mall.app_user_conver_funnel partition(dt='20260201') select
duah.active_num,
dgi.item_num,
duo.order_num,
duo.pay_num,
dgi.item_num/duah.active_num as active_to_item_ratio,
duo.order_num/dgi.item_num as item_to_order_ratio,
duo.pay_num/duo.order_num as order_to_pay_ratio
from
(
select
count(*) as active_num
from dws_mall.dws_user_active_history
where dt = '20260201'
) as duah
join
(
select
count(distinct goods_id) as item_num
from dwd_mall.dwd_good_item
where dt = '20260201'
)as dgi
on 1=1
join
(
select
count(*) as order_num,
sum(case when order_status != 0 then 1 else 0 end) as pay_num
from dwd_mall.dwd_user_order
where dt = '20260201'
) as duo
on 1=1;
五、开发脚本
1、表初始化脚本(初始化执行一次)
app_mall_init_table_4.sh
内容如下:
#!/bin/bash
# 需求四:漏斗分析
# app层数据库和表初始化脚本,只需要执行一次即可
hive -e "
create database if not exists app_mall;
create external table if not exists app_mall.app_user_conver_funnel(
active_num int,
item_num int,
order_num int,
pay_num int,
active_to_item_ratio decimal(10,2),
item_to_order_ratio decimal(10,2),
order_to_pay_ratio decimal(10,2)
)partitioned by(dt string)
row format delimited
fields terminated by '\t'
location 'hdfs://bigdata01:9000/data/app/user_conver_funnel/';
"
2、添加分区脚本(每天执行一次)
app_mall_add_partition_4.sh
内容如下:
#!/bin/bash
# 需求四:漏斗分析
# 每天凌晨执行一次
# 默认获取昨天的日期,也支持传参指定一个日期
if [ "z$1" = "z" ]
then
dt=`date +%Y%m%d --date="1 days ago"`
else
dt=$1
fi
hive -e "
insert overwrite table app_mall.app_user_conver_funnel partition(dt='${dt}') select
duah.active_num,
dgi.item_num,
duo.order_num,
duo.pay_num,
dgi.item_num/duah.active_num as active_to_item_ratio,
duo.order_num/dgi.item_num as item_to_order_ratio,
duo.pay_num/duo.order_num as order_to_pay_ratio
from
(
select
count(*) as active_num
from dws_mall.dws_user_active_history
where dt = '${dt}'
) as duah
join
(
select
count(distinct goods_id) as item_num
from dwd_mall.dwd_good_item
where dt = '${dt}'
)as dgi
on 1=1
join
(
select
count(*) as order_num,
sum(case when order_status != 0 then 1 else 0 end) as pay_num
from dwd_mall.dwd_user_order
where dt = '${dt}'
) as duo
on 1=1;
"
六、执行脚本
1、先执行初始化脚本
sh app_mall_init_table_4.sh
2、再执行添加分区脚本
sh app_mall_add_partition_4.sh 20260201
这个要等一会,估计5分钟,如下就好了;
七、验证结果
select * from app_mall.app_user_conver_funnel where dt = '20260201';