轉化率統計
表名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. 求每一步相對於第一步的轉化率
-
求出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
-
計算每一步相對第一步的轉化率,使用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. 求每一步相對於上一步的轉化率
-
使用窗口函數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升序排序。
-
計算每一步相對於上一步的轉化率,使用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)
-
自連接,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 ...
-
當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
-
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
-
計算每一步相對於上一步的轉化率
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