2014-09-03 3 views
2

데이터 변환 문제가 발생했습니다. 여기에 3 개의 열 (클라이언트, 이벤트, 타임 스탬프)이있는 테이블이 있습니다. 그리고 기본적으로 타임 스탬프를 기반으로 주어진 클라이언트의 모든 이벤트에 시퀀스 번호를 할당하고 싶습니다. 기본적으로이 시퀀스는 본인이 여기에 추가 한 "시퀀스"열입니다.하이브 또는 돼지의 시퀀스 번호 생성

Client Event TimeStamp    Sequence 
C1  Ph  2014-01-30 12:15:23  1 
C1  Me  2014-01-31 15:11:34  2 
C1  Me  2014-01-31 17:16:05  3 

C2  Me  2014-02-01 09:22:52  1 
C2  Ph  2014-02-01 17:22:52  2 

하이브 또는 돼지에서이 시퀀스 번호를 만드는 방법을 알아낼 수 없습니다. 어떤 단서가 있습니까?

미리 감사드립니다. 기욤

답변

4

(모든 그룹화 말에 의해), 타임 스탬프 필드로 가방 내부의 튜플을 정렬 한 후 Enumerate 기능을 사용하여 가방의 모든 기록을 넣습니다. 다음과 같은

뭔가 (당신이 조금 그것을 청소해야 할 수도 있습니다, 그래서 내가 코드를 실행하지 못했습니다) :

// assuming input contains 3 columns - client, event, timestamp 
input2 = GROUP input all; 
input3 = FOREACH input2 
     { 
      sorted = ORDER input BY timestamp; 
      sorted2 = Enumerate(sorted); 
      GENERATE FLATTEN(sorted2); 
     } 
+0

위대한 작품! 감사합니다 Gaurav – user3216394

0

우리는 결국 수정 열거 소스 다음과 같은 방법으로 그것을 잘 작동합니다 :

public void accumulate(Tuple arg0) throws IOException { 
nevents=13; 
i=nevents+1; 
DataBag inputBag = (DataBag)arg0.get(0); 
    Tuple t2 = TupleFactory.getInstance().newTuple(); 
for (Tuple t : inputBag) { 
    Tuple t1 = TupleFactory.getInstance().newTuple(t.getAll()); 
    tampon=t1.get(2).toString(); 
    if (tampon.equals("NA souscription Credit Conso")) { 
    if (i <= nevents) { 
     outputBag.add(t2); 
     t2=TupleFactory.getInstance().newTuple(); 
    } 
    i=0; 
    t2.append(t1.get(0).toString()); 
    t2.append(t1.get(1).toString()); 
    t2.append(t1.get(2).toString()); 
    i++; 
    } 
    else if (i < nevents) { 
    t2.append(tampon); 
    i++; 
    } 
    else if (i == nevents) { 
    t2.append(tampon); 
    outputBag.add(t2); 
    i++; 
    t2=TupleFactory.getInstance().newTuple(); 
    } 
    if (count % 1000000 == 0) { 
    outputBag.spill(); 
    count = 0; 
    } 
    ; 
    count++; 
} 
if (t2.size()!=0) { 
    outputBag.add(t2); 
} 
}