根据相对时间将用户操作分组到多个会话中

时间:2014-02-12 23:07:49

标签: python hive

我正在尝试计算用户拥有的照片会话数(大约同一时间拍摄的一组照片)。对于这个例子,我们只是说一张照片是会话的一部分,如果它是在该用户在前一张照片的1000秒内拍摄的。

最初我打算按照每个uid的时间来订购图片,然后将时间与它上面的行进行比较,但我不确定在蜂巢中执行此操作的最佳方式。

这是可能的吗,或者我会用另一种语言如python做更好的运气吗?

e.g。

table of data:  
uid | pid | time_in_sec  
001 | 111 | 1000  
001 | 222 | 1250  
001 | 333 | 2200  
001 | 444 | 5000  
002 | 555 | 2000  
002 | 666 | 2500  

结果:

uid | num_sessions  
001 | 2  
002 | 1

2 个答案:

答案 0 :(得分:0)

使用hive udf功能创建会话信息表,以便您可以完成其余的工作。

HIVE声明:

add file gen_session.py;
INSERT OVERWRITE TABLE session_info SELECT TRANSFORM(uid, ts) USING './gen_session.py' AS (uid, sid, start_ts, end_ts) FROM sample ;

gen_session.py

#!/usr/bin/python

import sys

SESSION_GAP = 1000

sid = 0

last_uid = None
start_ts, end_ts = None, None

for line in sys.stdin.readlines():
    info = line.split('\t')
    uid, ts = info[0], int(info[1].strip())

    # new session?
    if (last_uid != uid) or (last_uid == uid and ts - end_ts > SESSION_GAP):
        # write last session info
        if start_ts != None:
            print '\t'.join([str(x) for x in [uid, sid, start_ts, end_ts]])
        # assign new session
        sid += 1
        last_uid = uid
        start_ts = end_ts = ts
    end_ts = ts
print '\t'.join([str(x) for x in [uid, sid, start_ts, end_ts]])

答案 1 :(得分:0)

尝试以下方法。可能对您有用。 首先,创建tmp表:

use tmp ;
create table session_test(uid string,pid string,time_in_sec STRING) row format delimited    fields terminated by '|' ;
LOAD DATA LOCAL INPATH '/home/hadoop/a.txt' INTO TABLE session_test;

然后,尝试下面的sql:

select uid,sum(if(time_in_sec - last_time>=1000,1,0))+1
from (
select a.uid,a.time_in_sec,max(if(b.time_in_sec<a.time_in_sec,b.time_in_sec,null))  last_time
from session_test a join session_test b
on (a.uid = b.uid)
group by a.uid,a.time_in_sec
) b
group by uid