我正在尝试计算用户拥有的照片会话数(大约同一时间拍摄的一组照片)。对于这个例子,我们只是说一张照片是会话的一部分,如果它是在该用户在前一张照片的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
答案 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