2013-03-11 75 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