有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

记录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-这个reminderid=131235467,之后他用以下data做了一个order:{items:[{"prd":"131235467","count": 5, "amount": 11.6},{"prd": "13123545", "count": 1, "amount": 55.99}], oid: 5556} 在这种情况下{}和{}的{}是相同的,所以我想总结一下{}*{}->;在这种情况下,5*11.6=58并按如下方式输出

User 1234    Prdsum: 58    

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

输出:

User45687    Prdsum: 0

此日志的最终输出:

User 1234    Prdsum: 58    
User45687    Prdsum: 0

我的问题是:我如何比较(?)该值->id和{}在{}中? 关键是用户。自定义可写文件是否有用->;值=(id,数据)。我需要一些想法


共 (2) 个答案

  1. # 1 楼答案

    一种实现方法是使用复合密钥。 映射器输出键是用户id、事件id(提醒->;0,顺序->;1)的组合。使用userid对数据进行分区,您需要编写自己的比较器。 这里是要点

    Mapper

    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>
    

    使用userid进行分区,这样所有具有相同用户ID的条目都将进入同一个reducer

    减速器

    在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权威指南》或here

  2. # 2 楼答案

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

    User1234     Prdsum: 58    
    User45687    Prdsum: 0
    

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

    您是否需要将“状态”作为第一个Hadoop作业的一部分?如果是这样的话,那么你需要在你的映射器或reducer中保存一个HashMap或HashTable,它存储所有要比较的键(在本例中是用户)的值——但这不是一个好的设置,IMHO。您最好在一个Hadoop工作中进行聚合,然后在另一个Hadoop工作中进行比较