2016-11-30 6 views
0

enter image description here 수백만 개가 넘는 레코드가있는 하이브 테이블이 있습니다. 입력은 다음과 같은 유형이다 : 입력 : 내가 원하는 무엇두 개의 다른 열에서 연속 된 두 행의 두 날짜 간 차이

rowid  |starttime    |endtime     |line |status 
--- 1  2007-07-19 00:05:00 2007-07-19 00:23:00  l1  s1 
--- 2  2007-07-20 00:00:10 2007-07-20 00:22:00  l1  s2 
--- 3  2007-07-19 00:00:00 2007-07-19 00:11:00  l2  s2 

때 1 차 라인으로 STARTTIME 그룹에 의해 테이블입니다. 그런 다음 endtime과 starttime의 연속 된 두 행 사이의 차이점을 찾습니다. 차이가 5 분 이상인 경우 새 테이블에서 상태를 잘못 표시하여 사이에 새 행을 추가하십시오.

입력 행 1에서 시간 차이는 1 시간 10 분이므로 첫 번째 행에 대해 19 번째 날짜를 만들고 누락 된 시간으로 완료하고 20 번째 행을 아래에 추가하십시오.

출력 :

rowid |starttime    |endtime    |line |status 
--- 1 |2007-07-19 00:05:00  |2007-07-19 00:23:00 |l1  |s1 
--- 2 |2007-07-19 00:23:01  |2007-07-19 00:00:00 |l1  |misstime 
--- 3 |2007-07-20 00:00:01  |2007-07-20 00:00:09 |l1  |misstime 
--- 4 |2007-07-20 00:00:10  |2007-07-20 00:22:00 |l1  |s2 
--- 3 |2007-07-19 00:00:00  |2007-07-19 00:11:00 |l2  |s2 

사람이 나를 색조에서 직접이를 달성하는 데 도움이 수 - 하이브? 유닉스 스크립트로도 가능합니다.

미리 감사드립니다.

+0

당신이 샘플 날짜와 적절한 읽을 메이트 –

+0

형식 죄송 설정 해당 결과를 공유하시기 바랍니다 수 있습니다. 이것을 그림 파일 형식으로 제출하겠습니다. 회신 해 주셔서 감사합니다. – DrSD

+0

링크를 클릭하여 서식 문제와 관련된 이미지보기를 확인하십시오. 불편을 끼쳐 드려 죄송합니다. – DrSD

답변

0

솔루션 템플릿은 다음과 같습니다

  1. 사용 LAG() 함수는 이전의 라인 STARTTIME 또는 종료 시각을 얻을 수 있습니다.
  2. 각 줄마다 현재 시간과 이전 시간의 차이를 계산하십시오.
  3. 차이가 5 분을 넘는 행을 필터링하십시오.
  4. 데이터 집합을 필요한 출력으로 변환합니다.

예 :

insert into yourtable 
    select 
    s.rowid, 
    s.starttime , 
    s.endtime, 
    --calculate your status here, etc, etc 
from  
    (
    select rowid starttime endtime, 
      lag(endtime) over(partition by rowid order by starttime) prev_endtime 
    from yourtable) s 
    where (unix_timestamp(endtime) - unix_timestamp(prev_endtime))/60 > 5 --latency>5 min 
+0

나는 이것을 점검하지 않았고 출력 요구 사항을 명확하게 이해하지 못했지만 아이디어를 얻었기를 바랍니다. – leftjoin

+0

고마워, 나는 이것을 시도하고 게시 유지. – DrSD

+0

필요한 경우 서식을 사용하여 문제의 이미지보기를 확인하려면 링크를 클릭하십시오. 불편을 끼쳐 드려 죄송합니다. – DrSD