脚本宝典收集整理的这篇文章主要介绍了Hive计算最大连续登陆天数,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。@H_777_0@
问他方法,他竟然不告诉我,这么多年的兄弟情谊算个屁
。真当我没他聪明吗,哼!
靠人不如靠自己,我决定连夜研究一下在Hive
里面计算最大连续天数的计算方法。
在网站平台类业务需求中用户的「最大登陆天数」,需求比较普遍。
原始数据:
u0001 2019-10-10
u0001 2019-10-11
u0001 2019-10-12
u0001 2019-10-14
u0001 2019-10-15
u0001 2019-10-17
u0001 2019-10-18
u0001 2019-10-19
u0001 2019-10-20
u0002 2019-10-20
说明:数据是简化版,两列分别是user_id,LOG_in_date。现实情况需要从采集数据经过去重,转换得到以上形式数据。
我们先建表并且将数据导入Hive
:
create table test.user_log_1 (user_id string, log_in_date string) row format delimITed fields terminated by ' ';
load data local inpath '/VAR/lib/hadoop-hDFs/data/user_log.txt' into table test.user_log_1 ;
查看一下数据:
hive> select * From test.user_log_1 ;
OK
u0001 2019-10-10
u0001 2019-10-11
u0001 2019-10-12
u0001 2019-10-14
u0001 2019-10-15
u0001 2019-10-17
u0001 2019-10-18
u0001 2019-10-19
u0001 2019-10-20
u0002 2019-10-20
Time taken: 0.076 seconds, Fetched: 10 row(s)
核心是按访问时间排序,登陆时间列减去排序后的序列号,得到一个日期值,按这个值分组计数即可。
按照user_id
分组,并且按照日期log_in_date
排序:
select user_id, log_in_date, row_number() over(partition by user_id order by log_in_date) as rank from test.user_log_1;
结果:
u0001 2019-10-10 1
u0001 2019-10-11 2
u0001 2019-10-12 3
u0001 2019-10-14 4
u0001 2019-10-15 5
u0001 2019-10-17 6
u0001 2019-10-18 7
u0001 2019-10-19 8
u0001 2019-10-20 9
u0002 2019-10-20 1
这里可以看出,u0001
这个用户最大连续登录天数是4天,使用后面计算方法计算后可以验证。
可以看出规律,日期小的,行号也小;如果将日期跟行号做差值,连续登录的差值应该是一样的。
select user_id, date_sub(log_in_date, rank) dts from (select user_id, log_in_date, row_number() over(partition by user_id order by log_in_date) as rank from test.user_log_1)m;
结果:
u0001 2019-10-09
u0001 2019-10-09
u0001 2019-10-09
u0001 2019-10-10
u0001 2019-10-10
u0001 2019-10-11
u0001 2019-10-11
u0001 2019-10-11
u0001 2019-10-11
u0002 2019-10-19
显然可以看出,最大连续连续登录是4次。
select user_id, dts, count(1) num from (select user_id, date_sub(log_in_date, rank) dts from (select user_id, log_in_date, row_number() over(partition by user_id order by log_in_date) as rank from test.user_log_1)m)m2 group by user_id, dts;
结果:
u0001 2019-10-09 3
u0001 2019-10-10 2
u0001 2019-10-11 4
u0002 2019-10-19 1
已经算出了,每个用户连续登录天数序列,接下取每个用户最大登录天数最大值即可:
select user_id, max(num) from (select user_id, dts, count(1) num from (select user_id, date_sub(log_in_date, rank) dts from (select user_id, log_in_date, row_number() over(partition by user_id order by log_in_date) as rank from test.user_log_1)m)m2 group by user_id, dts)m3 group by user_id;
结果跟我们的预期是一致的,用户u0001
最大登录天数是4。
u0001 4
u0002 1
我们知道股票市场,比如咱们的A股,周末是不开盘的,那么一只股票如果上周五涨停,本周一接着涨停,这算是连续2天涨停,使用上面这种方法是不行的,使用lead
函数试试:
select user_id, log_in_date, lead(log_in_date) over(partition by user_id order by log_in_date) end_date from test.user_log_1;
结果
u0001 2019-10-10 2019-10-11
u0001 2019-10-11 2019-10-12
u0001 2019-10-12 2019-10-14
u0001 2019-10-14 2019-10-15
u0001 2019-10-15 2019-10-17
u0001 2019-10-17 2019-10-18
u0001 2019-10-18 2019-10-19
u0001 2019-10-19 2019-10-20
u0001 2019-10-20 NULL
u0002 2019-10-20 NULL
哈哈,是不是有思路了。
思路:上面结果一共有3列,第一列是uid
,通过lead
函数,后面两列都是日期,那么两列日期都取值周一
到周五
之间,也就是说数据里面只有工作日日期,没有周末的数据,可以提前过滤使得数据满足,既然要连续,那么:
差值等于1
,显然是连续的;差值等于3
,但是第三列日期是星期一,那么也算是连续了;以上两种条件综合,就能计算出股票的最大连续涨停天数
了,你学废了吗。
猜你喜欢 HDFS的快照讲解 Hadoop 数据迁移用法详解 Hbase修复工具Hbck 数仓建模分层理论 一文搞懂Hive的数据存储与压缩 大数据组件重点学习这几个
以上是脚本宝典为你收集整理的Hive计算最大连续登陆天数全部内容,希望文章能够帮你解决Hive计算最大连续登陆天数所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。