6

日志文件如下所示:

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有一个-reminderreminderid= , 在此之后131235467他做了一个order如下data{items:[{"prd":"131235467","count": 5, "amount": 11.6},{"prd": "13123545", "count": 1, "amount": 55.99}], oid: 5556}idprddatacountamount

User 1234    Prdsum: 58    

User45687也做了一个,order但他没有收到一个reminder所以没有总结他的data

输出:

User45687    Prdsum: 0

此日志的最终输出:

User 1234    Prdsum: 58    
User45687    Prdsum: 0

我的问题是:我如何比较(?)这个值 ->idprdin data?关键是用户。自定义 Writable 有用吗-> value= (id, data)。我需要一些想法。

4

2 回答 2

0

我建议您在第一次通过 Hadoop 作业时获取原始输出总和,因此在 Hadoop 作业结束时,您会得到如下结果:

User1234     Prdsum: 58    
User45687    Prdsum: 0

然后有第二个 Hadoop 作业(或独立作业)比较各种值并生成另一个报告。

您需要“状态”作为第一个 Hadoop 作业的一部分吗?如果是这样,那么您将需要在您的映射器或归约器中保留一个 HashMap 或 HashTable 来存储所有键(在这种情况下为用户)的值以进行比较——但这不是一个好的设置,恕我直言。你最好只在一个 Hadoop 工作中进行聚合,然后在另一个工作中进行比较。

于 2013-03-11T17:40:49.177 回答
0

一种实现方法是使用复合键。Mapper 输出 Key 是用户 ID、事件 ID 的组合(提醒 -> 0,订单 -> 1)。使用 userid 对数据进行分区,您需要编写自己的比较器。这是要点。

映射器

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 进行分区,因此具有相同用户的所有条目都将转到相同的减速器。

减速器

在 reducer 中,所有条目都将按用户 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 权威指南”或此处

于 2013-06-11T16:41:51.927 回答