漏斗轉化率統計實戰 &(hive嚴格模式,本地模式)


轉化率統計

表名order.txt
字段id, name, pv

1,廣告,10000
2,菜單,3000
3,詳情,2600
4,購物車,300
5,下單,200
6,支付,190
7,支付ok,189

用到關鍵技術:
自連接,窗口函數max


前期準備:

create database if not exists hive_order;
use hive_order;
drop table if exists t_order;
create table t_order(id int,name string,pv int) row format delimated fields terminated by “,”;
load data local inpath"/home/hadoopUser/order.txt" into table t_order;
select * from t_order;
desc t_order;


使用嚴格模式(set hive.mapred.mode = strict;)可以禁止3種類型的查詢:
(1)對於分區表,不加分區字段過濾條件,不能執行
(2)對於order by語句,必須使用limit語句。
(3)限制笛卡爾積的查詢(join的時候不使用on,而使用where的)

我們要對錶進行自連接,所以這裏不作嚴格模式,設置爲非嚴格。
set hive.mapred.mode = nonstrict;(默認undefined)

開啓本地模式,對於數據量比較少,執行時間會縮短。
set hive.exec.mode.local.auto=true;(默認爲false)

如此一來,對數據量比較小的操作,就可以在本地執行,這樣要比提交任務到集羣執行效率要快很多。


1. 求每一步相對於第一步的轉化率

  1. 求出pv的最大值,把最大值作爲一列
    select a.*,b.bpv from t_order a,(select max(pv) bpv from t_order) b;
    或者直接使用max窗口函數:
    select *,max(pv) over(order by id) bpv from t_order;

    id      name	pv		bpv
    1       廣告    10000   10000
    2       菜單    3000    10000
    3       詳情    2600    10000
    4       購物車  300     10000
    5       下單    200     10000
    6       支付    190     10000
    7       支付ok  189     10000
    
  2. 計算每一步相對第一步的轉化率,使用pv/bpv

    select t.*,t.pv/t.bpv from 
    (select a.*,b.bpv from t_order a,(select max(pv) bpv from t_order) b) t;
    或者:
    select t.*,(t.pv/t.bpv) from (select *,max(pv) over(order by id) bpv from t_order) t;
    
    id		name	pv		bpv		pv/bpv	
    1       廣告    10000   10000   1.0
    2       菜單    3000    10000   0.3
    3       詳情    2600    10000   0.26
    4       購物車  300     10000   0.03
    5       下單    200     10000   0.02
    6       支付    190     10000   0.019
    7       支付ok  189     10000   0.0189
    

2. 求每一步相對於上一步的轉化率

  1. 使用窗口函數max,保留本條記錄與上一條記錄相比的最大值
    select id,name,pv,
    max(pv) over(order by id rows between 1 preceding and current row)
    from t_order;

    id		name	pv		max(pv)
    1       廣告    10000   10000
    2       菜單    3000    10000
    3       詳情    2600    3000
    4       購物車  300     2600
    5       下單    200     300
    6       支付    190     200
    7       支付ok  189     190
    

    這裏不設分區,直接根據id升序排序。

  2. 計算每一步相對於上一步的轉化率,使用pv/max(pv)
    select id,name,pv,
    max(pv) over(order by id rows between 1 preceding and current row),
    pv/max(pv) over(order by id rows between 1 preceding and current row)
    from t_order;

    id		name	pv		max(pv)	pv/max(pv)
    1       廣告    10000   10000   1.0
    2       菜單    3000    10000   0.3
    3       詳情    2600    3000    0.8666666666666667
    4       購物車  300     2600    0.11538461538461539
    5       下單    200     300     0.6666666666666666
    6       支付    190     200     0.95
    7       支付ok  189     190     0.9947368421052631
    

3. 求每一步相對於上一步的轉化率(方法2)

  1. 自連接,49條記錄
    select a.*,b.id,b.pv from t_order a join t_order b;

    1       廣告    10000   1       10000
    2       菜單    3000    1       10000
    3       詳情    2600    1       10000
    4       購物車  300     1       10000
    5       下單    200     1       10000
    6       支付    190     1       10000
    7       支付ok  189     1       10000
    1       廣告    10000   2       3000
    2       菜單    3000    2       3000
    3       詳情    2600    2       3000
    4       購物車  300     2       3000
    5       下單    200     2       3000
    6       支付    190     2       3000
    7       支付ok  189     2       3000
    1       廣告    10000   3       2600
    ...
    
  2. 當a.id = b.id +1,那麼a.pv的值就等於b.pv的下一個值
    比如:
    當a=1,處於第一步廣告階段,a.pv=10000,但是沒有b=0的記錄,所以無法匹配。
    當a=2,處於第二步菜單階段,a.pv=3000,
    b=1+1=2,處於第一步廣告階段,b.pv=10000
    select a.*,b.id,b.pv from t_order a join t_order b on a.id = b.id+1;

    a	                  	b
    2       菜單    3000    1       10000
    3       詳情    2600    2       3000
    4       購物車  300     3       2600
    5       下單    200     4       300
    6       支付    190     5       200
    7       支付ok  189     6       190
    
  3. a的值還缺少a=1,所以需要連接,把a=1的記錄加到表中
    select a.*,b.id,b.pv from t_order a join t_order b on a.id = b.id+1
    union
    select *,id as bid,pv as bpv from t_order where id =1;

    a                       b
    1       廣告    10000   1       10000
    2       菜單    3000    1       10000
    3       詳情    2600    2       3000
    4       購物車  300     3       2600
    5       下單    200     4       300
    6       支付    190     5       200
    7       支付ok  189     6       190
    
  4. 計算每一步相對於上一步的轉化率
    select t.*,t.apv/t.bpv from
    (select a.id as aid,a.name as aname,a.pv as apv,
    b.id as bid,b.pv as bpv
    from t_order a join t_order b on a.id = b.id+1
    union
    select a.id as aid,a.name as aname,a.pv as apv,
    a.id as bid,a.pv as bpv
    from t_order a where a.id =1) t;

    aid     aname  	apv		bid		bpv		apv/bpv	
    1       廣告    10000   1       10000   1.0
    2       菜單    3000    1       10000   0.3
    3       詳情    2600    2       3000    0.8666666666666667
    4       購物車  300     3       2600    0.11538461538461539
    5       下單    200     4       300     0.6666666666666666
    6       支付    190     5       200     0.95
    7       支付ok  189     6       190     0.9947368421052631
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章