2014-02-12 3 views
0

사용자가 보유한 사진 세션 수 (같은 시간에 촬영 된 사진 그룹)를 계산하려고합니다. 이 예에서는 해당 사용자가 이전 사진보다 1000 초 이내에 찍은 사진이 세션의 일부라고합니다.상대 작업 시간을 기준으로 사용자 작업을 여러 세션으로 그룹화

원래는 한 장의 사진을 찍은 다음 그 시간을 위의 행과 비교하면서 사진을 주문할 계획 이었지만 하이브에서 가장 좋은 방법은 확실치 않습니다.

이게 가능합니까, 아니면 python과 같은 다른 언어로 이것을하는 것이 더 좋을까요?

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

사용 하이브 UDF 기능입니다.

HIVE 문 :

#!/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]]) 
0

당신을 위해 유용 할 수 method.May 아래 시도

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. 첫째, 만들 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 
관련 문제