2014-09-03 52 views
2

我正面臨數據轉換問題: 我在此處列出了具有3列的表格:client,event,timestamp。 我基本上想根據時間戳爲給定客戶端的所有事件分配一個序列號,這基本上是我在下面添加的「序列」列。在配置單元或Pig中創建序列號

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 2014-09-12 20:04:04

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); 
} 
}