记录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
-这个reminder
有id
=131235467
,之后他用以下data
做了一个order
:{items:[{"prd":"131235467","count": 5, "amount": 11.6},{"prd": "13123545", "count": 1, "amount": 55.99}], oid: 5556}
在这种情况下{
User 1234 Prdsum: 58
User45687
也做了一个order
但是他没有收到reminder
所以没有他的data
总结
输出:
User45687 Prdsum: 0
此日志的最终输出:
User 1234 Prdsum: 58
User45687 Prdsum: 0
我的问题是:我如何比较(?)该值->id
和{
# 1 楼答案
一种实现方法是使用复合密钥。 映射器输出键是用户id、事件id(提醒->;0,顺序->;1)的组合。使用userid对数据进行分区,您需要编写自己的比较器。 这里是要点
Mapper
使用userid进行分区,这样所有具有相同用户ID的条目都将进入同一个reducer
减速器
在reducer中,所有条目都将按用户id和已排序的事件id进行分组(即,首先您将获得给定用户id的所有提醒,然后是订单)
有关复合密钥的更多详细信息,请参阅《Hadoop权威指南》或here
# 2 楼答案
我建议在第一次通过一个Hadoop作业时获得原始输出和,因此在Hadoop作业结束时,会得到如下结果:
然后有第二个Hadoop作业(或独立作业),用于比较各种值并生成另一个报告
您是否需要将“状态”作为第一个Hadoop作业的一部分?如果是这样的话,那么你需要在你的映射器或reducer中保存一个HashMap或HashTable,它存储所有要比较的键(在本例中是用户)的值——但这不是一个好的设置,IMHO。您最好在一个Hadoop工作中进行聚合,然后在另一个Hadoop工作中进行比较