HQL打卡第2题

需求

1. 表格数据

user_idevent_ts
A1566300034
A1566300044
A1566300050
A1566300150
A1566300180
A1566300300
B1566300050
B1566300060
B1566300110
B1566300210
B1566300270
B1566300295

2. 最终结果

user_idevent_tsdiff_tsgroup_id
A156630003401
A1566300044101
A156630005061
A15663001501002
A1566300180302
A15663003001203
B156630005001
B1566300060101
B1566300110501
B15663002101002
B1566300270603
B1566300295253

3. 最终结果字段解释

字段名解释
DIFF_TS同一用户 id 之间相邻 EVENT_TS 时间间隔
GROUP_ID同一用户 id ,相邻时间间隔 > 50 的时候,分成一个小组

HQL 书写

1. 计算出每一行的 DIFF_TS

一、需要采用 Hive 的开窗函数,重点关注分区字段和排序字段:
1、分区字段: user_id
2、排序字段: event_ts
二、DIFF_TS 的计算
DIFF_TS 是用当前的时间戳减去上一行的时间戳,在 Hive 语法中可以使用 lag 函数。

lag(column, n, default_value)
表示取当前 column 的前 n 行的值,如果不存在则赋值为 default_value。

HQL语句如下所示:

select 
	user_id, 
	event_ts, 
	event_ts - (lag(event_ts, 1, event_ts) 
	over(partition by user_id order by event_ts)) as diff_ts
from 
	11_t_user_event;

上述表格的结果记为 subtable1

2. 当 DIFF_TS > 0 的时候,赋值为 1,否则赋值为 0

select 
	user_id, 
	event_ts, 
	diff_ts, 
	if(diff_ts > 50, 1, 0) as group_id_flag
from
	subtable1;

上述表格的结果记为 subtable2

3. 对于每个用户,GROUP_ID 的编号是从第一行到该行所有标号为 1 的个数加 1

select 
	user_id, 
	event_ts, 
	diff_ts, 
	sum(group_id_flag) 
	over(partition by user_id) + 1 as group_id
from
	subtable2;

最终 HQL 总结

select 
	user_id, 
	event_ts, 
	diff_ts, 
	sum(group_id_flag) 
	over(partition by user_id) + 1 as group_id
from
	(
	select 
		user_id, 
		event_ts, 
		diff_ts, 
		if(diff_ts > 50, 1, 0) as group_id_flag
	from
		(
		select 
	        user_id, 
	        event_ts, 
	        event_ts - (lag(event_ts, 1, event_ts) 
	        over(partition by user_id order by event_ts)) as diff_ts
        from 
	        user_event
        ) 
    as subtable1
    )
as subtable2;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值