点击上方“大话coding”,选择“星标”公众号
重磅干货,第一时间送达
大家好,我是小瑄
在电商项目中经常需要对用户购买行为进行分析,比如需要求用户连续购买天数,用户这次购买与上次购买间隔天数。
这里是基于hive on spark来对数据进行分析的,所以使用sql进行讲解
使用sql求用户连续购买天数以及与上次购买间隔天数,按照下面步骤进行处理
对数据进行聚合/去重
对用户进行分组排序
日期与序号进行减法运算
获取开始连续的日期以及连续天数
使用Hive中lead函数
根据业务需求不一样,可能名称也不一样,主要是理解思想。
对数据进行聚合/去重
第一步是对数据按天进行初步聚合(因为一个用户可能在某天有多次购买行为)
因为只是作为演示,所以只用单个用户进行
select member_id,order_date
from TABLE_NAME
where member_id='1690'
group by member_id,order_date
结果如下:
Step 2:对用户进行分组排序
我们把上一个结果表称为: TABLE_1
select
member_id
,order_date
,row_number() over(partition by member_id order by order_date) as rank_num
from
TABLE_1
结果如下:
Step 3:日期与序号进行减法运算
思路: 如果我的日期是连续的.这时日期减去序号天数,那么连续的日期会得到同一个日期,我们暂且称之为起始日期。
我们把上一个结果表称为: TABLE_2
select
member_id
,order_date
,rank_num
,date_sub(order_date,rank_num) as origin_date
from
TABLE_2
结果如下:
获取开始连续的日期以及连续天数
其实从上面的结果表中就已经能够统计出那些用户的连续天数满足需求了.为了保留更多信息,所以还是可以继续进行加工
我们把上一个结果表称为: TABLE_3
select
table_a.member_id as member_id
,table_a.continuous_start_date as continuous_start_date
,count(table_a.continuous_start_date) as continuous_date
from
(
select
member_id
,min(order_date) over(partition by member_id,origin_date) as continuous_start_date
from
TABLE_3
) table_a
group by table_a.member_id,table_a.continuous_start_date
结果如下:
使用Hive中lead函数
lead() over() 将下一行提到当前行来另起字段
lead(需要调整的字段名,下几行,空余部分用什么补充)
lag() over() 将上一行提到当前行来另起字段
lag(需要调整的字段名,上几行,空余部分用什么补充)
饱经沙场的都知道,产品提需求后面一般都会跟着无数的顺便、再来等等…
思路:
当(continuous_start_date + continuous_date) - 下一行的continuous_start_date =中断天数
其实算中断天数的方法很多.我这里就采用 lead函数来实现.我们把上面的结果表称为: TABLE_4
select
a.member_id as member_id
,a.continuous_start_date as continuous_start_date
,a.continuous_next_date as continuous_next_date
,a.continuous_date as continuous_date
,datediff(a.continuous_next_date,date_add(a.continuous_start_date,a.continuous_date)) as discontinuity_date
from
(
select
member_id as member_id
,continuous_start_date as continuous_start_date
,lead(continuous_start_date,1,0) over(partition by member_id,continuous_start_date) as continuous_next_date
,continuous_dateas continuous_date
from
TABLE_4
)a
结果如下: