您的位置:首页 > 其它

连续时间查询问题-查询一个用户连续登陆天数超过N天的用户

2014-08-05 09:42 169 查看
  问题:比如查询一个用户连续登陆天数超过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,但是在前面已经被丢掉了。所以还是用第一种吧。这里只是给大家一个思路。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐