2013-03-11 111 views
6

日誌文件看起來是這樣的:Hadoop的 - 分析日誌文件(Java)的

Time stamp,activity,-,User,-,id,-,data 

-

2013-01-08T16:21:35.561+0100,reminder,-,User1234,-,131235467,-,- 
2013-01-02T15:57:24.024+0100,order,-,User1234,-,-,-,{items:[{"prd":"131235467","count": 5, "amount": 11.6},{"prd": "13123545", "count": 1, "amount": 55.99}], oid: 5556} 
2013-01-08T16:21:35.561+0100,login,-,User45687,-,143435467,-,- 
2013-01-08T16:21:35.561+0100,reminder,-,User45687,-,143435467,-,- 
2013-01-08T16:21:35.561+0100,order,-,User45687,-,-,-,{items:[{"prd":"1315467","count": 5, "amount": 11.6},{"prd": "133545", "count": 1, "amount": 55.99}], oid: 5556} 
... 
... 

編輯

從該日誌

具體的例子:

User1234得到了reminder - th是reminder具有id = 131235467,在此之後,他與以下dataorder{items:[{"prd":"131235467","count": 5, "amount": 11.6},{"prd": "13123545", "count": 1, "amount": 55.99}], oid: 5556} 在這種情況下iddataprd是相同的,所以我想綜上所述count * amount - >在這種情況下5 * 11.6 = 58和輸出像

User 1234 Prdsum: 58  

User45687也作出了order但他沒有收到reminder所以沒有總結他data

輸出:

User45687 Prdsum: 0 

這篇日誌的最終輸出:

User 1234 Prdsum: 58  
User45687 Prdsum: 0 

我的問題是:我該如何比較這價值觀 - >iddataprd(?)? 關鍵是用戶。自定義的Writable會有用 - > value =(id,data)。我需要一些想法。

+0

有什麼問題可以找到? – 2013-03-11 15:36:59

回答

0

我建議讓你在做的一個Hadoop的工作的第一階段的結果,所以在Hadoop的作業結束時的原始輸出總和,你有這樣的結果:

User1234  Prdsum: 58  
User45687 Prdsum: 0 

然後有第二個Hadoop作業(或獨立作業),比較各個值並生成另一個報告。

您是否需要「狀態」作爲第一個Hadoop工作的一部分?如果是這樣,那麼你將需要保存一個HashMap或HashTable在映射器或Reducer中,它存儲了所有鍵值(在這種情況下爲用戶)進行比較 - 但這不是一個好的設置,恕我直言。您最好在一個Hadoop作業中進行聚合,然後在另一個Hadoop作業中進行比較。

+0

User1234有一個2 prd的訂單,所以當我總結輸出時,它會有a){「prd」:「131235467」,「count」:5,「amount」:11.6} - > 5 * 11, 6 = 58和b){「prd」:「13123545」,「計數」:1,「量」:55.99} - > 1 * 55,99 = 55,99。但是我只是在a)中提出了一個提醒的標識符。當我在第一份工作中獲得原始產出總和時。我如何區分第二份工作中哪一筆是我正在尋找的(reminder.id == data.prd)?或者我明白你的答案錯了? – JustTheAverageGirl 2013-03-12 10:34:39

0

一種實現方法是使用複合鍵。 映射器輸出鍵是用戶ID,事件ID(提醒 - > 0,順序 - > 1)的組合。使用用戶標識分區數據,你需要編寫自己的比較器。 這裏是要點。

映射

for every event check the event type 
    if event type is "reminder" 
     emit : <User1234,0> <reminder id> 
    if event type is "order" 
     split if you have multiple orders 
     for every order 
      emit : <User1234,1> <prd, count* amount, other interested blah> 

分區使用用戶ID所以用同一個用戶的所有條目是會去同一個減速。

減速

在減速所有參賽作品將通過用戶名和排序的事件ID(即第一,你會得到一個給定用戶ID的所有提醒,其次是訂單)進行分組。複合鍵

If `eventid` is 0 
    add reminders id to a set (`reminderSet`). 

If `eventid` is is 1 && prd is in `remindersSet` 
    emit : `<userid> <prdsum>` 
else 
    emit : `<userid> <0>` 

更多細節可以在「Hadoop的權威指南」或here