问题:比如查询一个用户连续登陆天数超过7天的用户,或者查询连续在7天的某个时间段登陆的用户。
网上查询sql的语句的用法,对于hive来说也可以试试,查询词"SQL 连续天数查询"
如果使用hadoop如何解决??
思路(以连续N天登陆为例):
1、计算出每天登陆的用户集合
1、使用MR,第一个job(map以日期为key,对用户进行分组输出。reduce设计:内部构造一个以N容量大小的列表(作为队列),模拟一下啊(日期过来就是有序的,从小到大)
1)第一个日期过来,放在list里面,list里面的元素是一个map(key为日期,value为hashset 内部装的是用户ID))
2)第二个日期过来了,和上一个比较,如果是连续的放进去,如果不连续(就是说中间有一个日期没有记录),清空list,重新装作为第一个。
3)第三个来了..................同第二部
4)第N个过来了,放入list,此时list装了连续N个数据。这是就需要取各个元素的hashset的交集了,这样容易吧。
输出,以第一个日期-第N个日期为key,输出用户的交集(value)
5) 又来了,因为是队列,所以如第二部和第四部,就这样了。
----------------------
如果采用hive sql语句编写的话,很难,因为想不出来。
试着使用pig,数据流也很麻烦。所以想了上面这个方法。
----------------------
再想想MR,貌似内存浪费的太多,需要构造N个hashset来存储各个日期的用户ID,太浪费了。事实上,我们所比较的都是以list列表的第一个为依据,因为计算的是N个日期都有的用户ID,所以可以这样:
1、第一个过来了,直接构造一个map,key为用户ID,value为个数,第一次为1
2、第二个过来了,比较和第一个的日期,是否连续,不连续,删除第一个装第二个。连续,通过map来进行依次比较,如果有个数加1。
3、第三个过来了,需要维护一个全局变量来保证日期的有序。对map进行统计
4、。。。。。。
5、到第N个了,对map进行计算,统计value的个数是否为N,为N的就是所需要的结果。
6、貌似不行,此时我需要装前面第二个过来的为map,但是在前面已经被丢掉了。所以还是用第一种吧。这里只是给大家一个思路。
连续时间查询问题-查询一个用户连续登陆天数超过N天的用户,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/jsunday/p/3891549.html