페이지 체류 시간 을 계산 하 는 다른 방식

4780 단어 presto
계산 페이지 가 머 무 르 는 시간 이 길 고 평소 계산 도 페이지 가 머 무 르 는 시간 이 길 면 spark 나 이 mr 임 무 를 달 려 서 실현 해 야 합 니 다. sql 을 달 려 서 실현 할 수 있다 면 가장 좋 습 니 다.
메모: 여기 사용 되 는 계산 엔진 은 presto 입 니 다.
먼저 사용자 조회 기록 데이터 표를 만 듭 니 다. 표 구 조 는 간단 합 니 다. 3 개의 필드 만 있 습 니 다. uid 사용자 id, page 페이지 링크, time 이 페이지 에 들 어 가 는 시간 스탬프 입 니 다.페이지 가 떠 나 는 시간 이 있다 면 떠 나 는 시간 - 들 어 가 는 시간 은 페이지 가 머 무 는 시간 입 니 다.잘 생각 했 습 니 다. 아 쉽게 도 보통 상황 에서 페이지 타 점 은 페이지 에 들 어 가 는 시간 만 기록 하고 페이지 가 떠 나 는 시간 을 기록 하지 않 습 니 다.페이지 체류 시간 을 계산 하려 면 사용자 가 다음 페이지 nextpage 에 들 어 가 는 시간 을 통 해 현재 페이지 curpage 의 시간 을 빼 는 방식 으로 계산 해 야 합 니 다. 이것 도 페이지 체류 시간 을 계산 하 는 난점 입 니 다.오늘 우 리 는 sql 로 이 기능 을 실현 할 것 이다.
CREATE TABLE hadoop.wh.site_flow_test ( 
uid varchar, 
page varchar, 
time long ) 
WITH ( format = 'ORC' )

테스트 데이터
userid1,index,1539242423
userid1,index,1539243421
userid1,page,1539243421
userid1,detail,1539213421
userid1,detail,1539223421
userid1,page,1539243121
userid1,detail,1539253421
userid2,index,1539241423
userid2,index,1539243221
userid2,page,1539243411
userid2,detail,1539242421
userid2,detail,1539240421
userid2,page,1539243221
userid2,detail,1539213421


첫 번 째 단 계 는 모든 탐색 페이지 데이터 집합 형식 에 대해 다음 과 같 습 니 다. uid, [page 1, page 2], [time 1, time 2];이 데 이 터 는 사용자 가 페이지 1 페이지 에 들 어 가 는 시간 이 time 1 이라는 뜻 입 니 다. 그 중에서 time 1 과 time 2 는 오름차 순 으로 배열 되 어 있 으 며 구체 적 으로 다음 과 같 습 니 다.
create table hadoop.wh.site_flow_tmp (uid,pages,arrs)
as
with a as (select uid,page,time from hadoop.wh.site_flow_test order by time  )
select uid,array_agg(page),array_agg(time) from a group by uid
    

uid▼pages▼arrs▼

userid2	PrestoArray{ array=[detail, detail, index, detail, index, page, page]}	PrestoArray{ array=[1.539213421E9, 1.539240421E9, 1.539241423E9, 1.539242421E9, 1.539243221E9, 1.539243221E9, 1.539243411E9]}
userid1	PrestoArray{ array=[detail, detail, index, page, index, page, detail]}	PrestoArray{ array=[1.539213421E9, 1.539223421E9, 1.539242423E9, 1.539243121E9, 1.539243421E9, 1.539243421E9, 1.539253421E9]}

시작 시간 배열 과 끝 시간 배열 을 구축 합 니 다. starts 필드 는 대응 하 는 pages 아래 표 시 된 페이지 에 들 어 가 는 시간 을 말 합 니 다. ends 는 pages 아래 표 에 대응 하 는 떠 나 는 시간 입 니 다.userid 2 사용 자 는 7 개의 페이지 를 훑 어 보 았 습 니 다. 마지막 페이지 의 떠 나 는 시간 은 연결 되 지 않 기 때문에 마지막 페이지 의 떠 나 는 시간 은 바로 들 어 가 는 시간 입 니 다. 페이지 가 머 무 르 는 시간 을 계산 하면 0 이 됩 니 다.
create table hadoop.wh.site_flow_tmp2 (uid,pages,starts,ends) as
select uid,pages,slice(arrs,1,cardinality(arrs)) starts ,concat(slice(arrs,2,cardinality(arrs)),slice(arrs,cardinality(arrs),1)) ends
from hadoop.wh.site_flow_tmp 


uid▼pages▼starts▼ends▼
userid2	
PrestoArray{ array=[detail, detail, index, detail, index, page, page]}	
PrestoArray{ array=[1.539213421E9, 1.539240421E9, 1.539241423E9, 1.539242421E9, 1.539243221E9, 1.539243221E9, 1.539243411E9]}	
PrestoArray{ array=[1.539240421E9, 1.539241423E9, 1.539242421E9, 1.539243221E9, 1.539243221E9, 1.539243411E9, 1.539243411E9]}
userid1	
PrestoArray{ array=[detail, detail, index, page, index, page, detail]}	
PrestoArray{ array=[1.539213421E9, 1.539223421E9, 1.539242423E9, 1.539243121E9, 1.539243421E9, 1.539243421E9, 1.539253421E9]}	PrestoArray{ array=[1.539223421E9, 1.539242423E9, 1.539243121E9, 1.539243421E9, 1.539243421E9, 1.539253421E9, 1.539253421E9]}





떠 나 는 시간 에서 입장 시간 을 빼 면 페이지 체류 시간 을 얻 을 수 있다.
create table hadoop.wh.site_flow_tmp3(uid,pages,starts,result) as
SELECT uid,pages,starts,zip_with(starts, ends, (x, y) -> y- x) from hadoop.wh.site_flow_tmp2 


uid▼pages▼starts▼result▼
userid2	
PrestoArray{ array=[detail, detail, index, detail, index, page, page]}	
PrestoArray{ array=[1.539213421E9, 1.539240421E9, 1.539241423E9, 1.539242421E9, 1.539243221E9, 1.539243221E9, 1.539243411E9]}	
PrestoArray{ array=[27000.0, 1002.0, 998.0, 800.0, 0.0, 190.0, 0.0]}
userid1	
PrestoArray{ array=[detail, detail, index, page, index, page, detail]}	
PrestoArray{ array=[1.539213421E9, 1.539223421E9, 1.539242423E9, 1.539243121E9, 1.539243421E9, 1.539243421E9, 1.539253421E9]}	
PrestoArray{ array=[10000.0, 19002.0, 698.0, 300.0, 0.0, 10000.0, 0.0]}




데이터
 with a as (SELECT uid,pages,starts,result from hadoop.wh.site_flow_tmp3 )
 select uid,page,starttime,pagetime from a CROSS JOIN UNNEST(pages,starts,result) t (page,starttime,pagetime)
 

uid▼page▼starttime▼pagetime▼
userid2	detail	1539213421	27000
userid2	detail	1539240421	1002
userid2	index	1539241423	998
userid2	detail	1539242421	800
userid2	index	1539243221	0
userid2	page	1539243221	190
userid2	page	1539243411	0
userid1	detail	1539213421	10000
userid1	detail	1539223421	19002
userid1	index	1539242423	698
userid1	page	1539243121	300
userid1	index	1539243421	0
userid1	page	1539243421	10000
userid1	detail	1539253421	0

좋은 웹페이지 즐겨찾기